From d74549e495c58eb4a560279fd9f05508401ea0a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Nov 2026 03:58:30 -0500 Subject: [PATCH] chore(main): release rea-agents 6.9.0 (#7104) * chore(main): release rea-agents 6.9.0 * docs(release): curate 6.9.0 notes and contribution provenance * docs(release): explain reviewed result and recovery migrations * docs(release): refresh 6.9.0 provenance through capture parser fix * docs(release): include worker admission CI fix and refresh provenance * docs(release): refresh candidate with lifecycle CI fixes * docs(release): include ReFS support in 6.9.0 notes * docs(release): include UnityFS boundary repair in 6.9.0 --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> --- .agents/plugins/marketplace.json | 2 +- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 4 +- .codex-plugin/mcp.json | 2 +- .codex-plugin/plugin.json | 2 +- .cursor-plugin/plugin.json | 2 +- .release-please-manifest.json | 2 +- CHANGELOG.md | 142 +- docs/getting-started/installation.md | 4 +- docs/releases/6.9.0.contributions.json | 56495 +++++++++++++++++++++++ mcp.json | 2 +- package-lock.json | 4 +- package.json | 2 +- server.json | 4 +- src/generatedPackageMetadata.ts | 2 +- 15 files changed, 56653 insertions(+), 18 deletions(-) create mode 100644 docs/releases/6.9.0.contributions.json diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 181e6d284a..89471e7b7f 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -9,7 +9,7 @@ "source": { "source": "npm", "package": "rea-agents", - "version": "6.8.0" + "version": "6.9.0" }, "policy": { "installation": "AVAILABLE", diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 17ccc3b0af..a4e101c321 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -13,7 +13,7 @@ "source": { "source": "npm", "package": "rea-agents", - "version": "6.8.0" + "version": "6.9.0" }, "category": "development" } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index de7b7228a1..c7eb3bb29b 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "rea", - "version": "6.8.0", + "version": "6.9.0", "description": "Reverse engineer anything with agents, from app behavior down to native binaries.", "author": { "name": "morluto", @@ -21,7 +21,7 @@ "command": "node", "args": [ "${CLAUDE_PLUGIN_ROOT}/scripts/plugin-mcp-launcher.mjs", - "6.8.0" + "6.9.0" ] } }, diff --git a/.codex-plugin/mcp.json b/.codex-plugin/mcp.json index 718c42503b..90bb426f7b 100644 --- a/.codex-plugin/mcp.json +++ b/.codex-plugin/mcp.json @@ -4,7 +4,7 @@ "command": "node", "args": [ "./scripts/plugin-mcp-launcher.mjs", - "6.8.0" + "6.9.0" ], "cwd": ".", "startup_timeout_sec": 30 diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index c3207ab9ea..5393be34da 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "rea", - "version": "6.8.0", + "version": "6.9.0", "description": "Reverse engineer anything with agents, from app behavior down to native binaries.", "author": { "name": "morluto", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 1d0ca8c4db..ba32b0405d 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "rea", - "version": "6.8.0", + "version": "6.9.0", "description": "Reverse engineer anything with agents, from app behavior down to native binaries.", "author": { "name": "morluto", diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e85ec109fd..7c53a1b7c2 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "6.8.0" + ".": "6.9.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1aed22ad81..5ee531c7fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,146 @@ # Changelog -The next release changes analysis-setting output (#9885). `update_analysis_settings`, `inspect_analysis_settings`, and limit errors no longer include `rea_restart_required`, `restart_required`, `restartRequired`, or `effect`. Read `update_mode` (`runtime`, `restart`, or `parameter`) and `pending_restart`. `runtime` means the setter can change the active value. `restart` means this process keeps the value it started with. `parameter` means this call supplied the value, so `update_analysis_settings` cannot change it; artifact reader limits, web-network capture budgets, and an explicit `analysis_timeout_ms`, `max_heap_mb`, or `command_timeout_ms` use it. There is no compatibility alias. Release Please should copy this migration into that release's breaking-changes section. +## [6.9.0](https://github.com/morluto/rea/compare/rea-agents-6.8.0...rea-agents-6.9.0) (2026-11-11) + +### Highlights + +- Build and test desktop tasks from recorded application state, including downloaded Linux apps, reusable build computers and multiple tasks per capture. +- Inspect more shipped artifacts offline: standalone application bundles, embedded firmware, NTFS acquisitions, API contracts and V8 code-cache containers. +- Keep native and runtime investigations grounded in retained Evidence, with paged results, explicit coverage and recoverable resource limits. + +### Changes + +- Analyze targets and create private runtimes on fixed local ReFS volumes as well as NTFS, preserving persistent ACL, file identity, snapshot and cleanup checks. [#10086](https://github.com/morluto/rea/pull/10086). Thanks @QianNangong. +- Capture, export and witness desktop tasks inside a build computer; keep an agentenv computer available through MCP and prepare a build host from one command. [#8954](https://github.com/morluto/rea/pull/8954), [#9041](https://github.com/morluto/rea/pull/9041), [#9045](https://github.com/morluto/rea/pull/9045), [#9049](https://github.com/morluto/rea/pull/9049), [#9199](https://github.com/morluto/rea/pull/9199). Thanks @earakely-scale. +- Install desktop apps from SHA-256-pinned AppImages or upstream archives, retain selected package dependencies, and isolate explicitly declared build secrets. [#9215](https://github.com/morluto/rea/pull/9215), [#9112](https://github.com/morluto/rea/pull/9112), [#9225](https://github.com/morluto/rea/pull/9225). Thanks @earakely-scale. +- Choose seed/end checkpoints, open seed documents at launch, build several tasks from one capture, and evaluate unreadable app state through headless checks or a screen judge. [#9037](https://github.com/morluto/rea/pull/9037), [#9054](https://github.com/morluto/rea/pull/9054), [#9216](https://github.com/morluto/rea/pull/9216), [#9217](https://github.com/morluto/rea/pull/9217), [issue morluto/rea#9676](https://github.com/morluto/rea/issues/9676). Thanks @earakely-scale. +- Read gzip and XML desktop documents and draft assertions for nested fields, attribute text, child text and member counts. [#9050](https://github.com/morluto/rea/pull/9050), [#9111](https://github.com/morluto/rea/pull/9111), [#9114](https://github.com/morluto/rea/pull/9114), [#9132](https://github.com/morluto/rea/pull/9132), [#9185](https://github.com/morluto/rea/pull/9185). Thanks @earakely-scale. +- Inventory and extract .NET single-file, Bun standalone and Deno compile executables, with caller-selected entries and output destinations. [#3787](https://github.com/morluto/rea/pull/3787), [#4031](https://github.com/morluto/rea/pull/4031), [#6998](https://github.com/morluto/rea/pull/6998), [#8527](https://github.com/morluto/rea/pull/8527), [issue morluto/rea#2352](https://github.com/morluto/rea/issues/2352), [issue morluto/rea#3490](https://github.com/morluto/rea/issues/3490). Thanks @gensokyo-dev, @jsk1004ha, @matbrgz, @mvanhorn, @Rinkia, @Zhong-fan. +- Read UnityFS bundles, Godot 3 PCK archives, WeChat mini-program packages, Zstandard ZIP members and classic iNES regions. [#7699](https://github.com/morluto/rea/pull/7699), [#7781](https://github.com/morluto/rea/pull/7781), [#8148](https://github.com/morluto/rea/pull/8148), [#7780](https://github.com/morluto/rea/pull/7780), [#2816](https://github.com/morluto/rea/pull/2816). Thanks @blankym, @gensokyo-dev, @ShuaixinHuang, @XiaoBinGan, @Zhong-fan. +- Inspect and extract Intel HEX, Motorola S-record, U-Boot uImage/FIT, ESP flash, UF2 and DfuSe firmware regions while retaining their container declarations. [#7136](https://github.com/morluto/rea/pull/7136), [#7234](https://github.com/morluto/rea/pull/7234), [#7771](https://github.com/morluto/rea/pull/7771), [#7498](https://github.com/morluto/rea/pull/7498), [#8228](https://github.com/morluto/rea/pull/8228), [#8230](https://github.com/morluto/rea/pull/8230). Thanks @555aaditya, @Entrpi, @gensokyo-dev, @iamcipherdev. +- Inventory offline NTFS MFT records and paired USN journal acquisitions; retain source names, journal-version coverage and verified extension-attribute ownership. [#9911](https://github.com/morluto/rea/pull/9911), [#9914](https://github.com/morluto/rea/pull/9914), [#9957](https://github.com/morluto/rea/pull/9957), [#10006](https://github.com/morluto/rea/pull/10006), [issue morluto/rea#9867](https://github.com/morluto/rea/issues/9867). Thanks @2SinceJuly, @gensokyo-dev, @jayykernel, @N0zoM1z0. +- Inspect V8 code-cache headers and retained byte patterns without executing the cache; report Electron cachedData boundaries and custom URL protocol registrations. [#8993](https://github.com/morluto/rea/pull/8993), [#9501](https://github.com/morluto/rea/pull/9501), [#2978](https://github.com/morluto/rea/pull/2978). Thanks @2SinceJuly, @gensokyo-dev, @UnknownHacker1, @XiaoBinGan. +- Inventory local OpenAPI operations and GraphQL SDL fields/references; compare static JavaScript endpoints with HAR observations. [#9104](https://github.com/morluto/rea/pull/9104), [#9140](https://github.com/morluto/rea/pull/9140), [#9090](https://github.com/morluto/rea/pull/9090), [issue morluto/rea#3591](https://github.com/morluto/rea/issues/3591). Thanks @gensokyo-dev, @Y0UW1SH. +- Import saved Playwright v10 trace Evidence, page scenario summaries, reuse saved response values across steps, and validate browser scenarios offline. [#9127](https://github.com/morluto/rea/pull/9127), [#7120](https://github.com/morluto/rea/pull/7120), [#7267](https://github.com/morluto/rea/pull/7267), [#7343](https://github.com/morluto/rea/pull/7343), [issue morluto/rea#5488](https://github.com/morluto/rea/issues/5488), [issue morluto/rea#6167](https://github.com/morluto/rea/issues/6167). Thanks @debavelaerel, @earakely-scale, @gensokyo-dev, @jayykernel, @kaoru0822-kitauji, @z2Ace0107. +- Replay captured environment writes, including variable member sets, sorted creates, references, toggles and subsequent reads that explain the resulting state. [#7260](https://github.com/morluto/rea/pull/7260), [#7274](https://github.com/morluto/rea/pull/7274), [#7332](https://github.com/morluto/rea/pull/7332), [#7539](https://github.com/morluto/rea/pull/7539), [#7600](https://github.com/morluto/rea/pull/7600). Thanks @earakely-scale. +- Apply selected R8 mappings, inspect Android manifest component declarations, link static JNI candidates and trace callers of external DEX methods. [#7456](https://github.com/morluto/rea/pull/7456), [#7379](https://github.com/morluto/rea/pull/7379), [#7472](https://github.com/morluto/rea/pull/7472), [#8154](https://github.com/morluto/rea/pull/8154), [issue morluto/rea#4448](https://github.com/morluto/rea/issues/4448), [issue morluto/rea#6329](https://github.com/morluto/rea/issues/6329), [issue morluto/rea#6403](https://github.com/morluto/rea/issues/6403), [issue morluto/rea#7811](https://github.com/morluto/rea/issues/7811). Thanks @555aaditya, @coygeek, @gensokyo-dev, @harshjohiya, @jayykernel, @Rinkia, @xu91102. +- Expose managed field defaults, project retained member views, suggest Unity managed members and retain IL2CPP v108 header/string Evidence. [#8015](https://github.com/morluto/rea/pull/8015), [#7968](https://github.com/morluto/rea/pull/7968), [#5511](https://github.com/morluto/rea/pull/5511), [#9925](https://github.com/morluto/rea/pull/9925), [issue morluto/rea#7282](https://github.com/morluto/rea/issues/7282). Thanks @379061296, @8rulerstar, @dhruvac29, @Entrpi, @gensokyo-dev, @Henglie, @kaoru0822-kitauji, @ShuaixinHuang, @XiaoBinGan, @xu91102. +- Report ELF/PE/Mach-O hardening, per-slice Mach-O encryption, initializer/finalizer functions and ELF function ranges recovered from unwind tables. [#8524](https://github.com/morluto/rea/pull/8524), [#5359](https://github.com/morluto/rea/pull/5359), [#9574](https://github.com/morluto/rea/pull/9574), [#9585](https://github.com/morluto/rea/pull/9585), [issue morluto/rea#4306](https://github.com/morluto/rea/issues/4306). Thanks @chordpli, @coygeek, @gensokyo-dev, @mvanhorn. +- Read Linux core-dump process/mapping notes, kernel version/configuration data and Android ELF identity notes; join Apple IPS images to admitted Mach-O slices. [#8830](https://github.com/morluto/rea/pull/8830), [#9573](https://github.com/morluto/rea/pull/9573), [#9502](https://github.com/morluto/rea/pull/9502), [#9570](https://github.com/morluto/rea/pull/9570). Thanks @2SinceJuly, @mvanhorn, @rishikeshgowdakk, @saariuslystoned. +- Open native extension/framework/XPC/plugin bundles, retain LLDB source coordinates and recover bounded Go string literals from pointer/length headers. [#8117](https://github.com/morluto/rea/pull/8117), [#2800](https://github.com/morluto/rea/pull/2800), [#9206](https://github.com/morluto/rea/pull/9206). Thanks @kaoru0822-kitauji, @matbrgz, @saariuslystoned. +- Reuse Ghidra projects through verified copies and checkpoint owned Programs across sessions; add Windows P0 DOS MZ and RISC-V ilp32 admission. [#7236](https://github.com/morluto/rea/pull/7236), [#9236](https://github.com/morluto/rea/pull/9236), [#7144](https://github.com/morluto/rea/pull/7144), [#8229](https://github.com/morluto/rea/pull/8229), [issue morluto/rea#1048](https://github.com/morluto/rea/issues/1048). Thanks @akushonkamen, @corysutyak, @dark13b, @Entrpi, @gensokyo-dev. +- Retry failed Kuna or directory decompiles independently and preserve stored pointer references and decompile-export source facts. [#8793](https://github.com/morluto/rea/pull/8793), [#8811](https://github.com/morluto/rea/pull/8811), [#8851](https://github.com/morluto/rea/pull/8851), [#8805](https://github.com/morluto/rea/pull/8805). +- Read selected Evidence records and discover missing links without transferring whole bundles; aggregate retained comparison references and compare artifact inventories. [#8528](https://github.com/morluto/rea/pull/8528), [#8633](https://github.com/morluto/rea/pull/8633), [#8267](https://github.com/morluto/rea/pull/8267), [#7869](https://github.com/morluto/rea/pull/7869), [issue morluto/rea#7678](https://github.com/morluto/rea/issues/7678), [issue morluto/rea#8214](https://github.com/morluto/rea/issues/8214), [issue morluto/rea#8307](https://github.com/morluto/rea/issues/8307), [issue morluto/rea#8454](https://github.com/morluto/rea/issues/8454). Thanks @Entrpi, @gensokyo-dev, @kaoru0822-kitauji. +- Page retained native observations, procedure/instruction references, feature traces and batch decompile summaries instead of repeating complete results. [#7134](https://github.com/morluto/rea/pull/7134), [#7146](https://github.com/morluto/rea/pull/7146), [#8585](https://github.com/morluto/rea/pull/8585), [#8588](https://github.com/morluto/rea/pull/8588), [#8591](https://github.com/morluto/rea/pull/8591), [#8594](https://github.com/morluto/rea/pull/8594), [#8629](https://github.com/morluto/rea/pull/8629), [#8631](https://github.com/morluto/rea/pull/8631), [issue morluto/rea#8498](https://github.com/morluto/rea/issues/8498), [issue morluto/rea#8510](https://github.com/morluto/rea/issues/8510). Thanks @gensokyo-dev, @kaoru0822-kitauji. +- Expose guided workflows and installed guidance search through CLI/MCP, recover from common argument-name mistakes, and support CSV/TSV analysis views. [#6995](https://github.com/morluto/rea/pull/6995), [#6996](https://github.com/morluto/rea/pull/6996), [#8305](https://github.com/morluto/rea/pull/8305), [#8649](https://github.com/morluto/rea/pull/8649), [#7254](https://github.com/morluto/rea/pull/7254), [issue morluto/rea#2146](https://github.com/morluto/rea/issues/2146), [issue morluto/rea#5482](https://github.com/morluto/rea/issues/5482), [issue morluto/rea#6916](https://github.com/morluto/rea/issues/6916), [issue morluto/rea#6918](https://github.com/morluto/rea/issues/6918), [issue morluto/rea#8290](https://github.com/morluto/rea/issues/8290). Thanks @coygeek, @Deepak-Kambala, @gensokyo-dev, @HarsH-1877, @jayykernel, @kaoru0822-kitauji, @pablodiazjorge, @Tapraj-Pathak. +- Select MCP tool families and compact output schemas; refresh provider candidates without switching and inspect provider-selection/release-verification diagnostics. [#7228](https://github.com/morluto/rea/pull/7228), [#7218](https://github.com/morluto/rea/pull/7218), [#8487](https://github.com/morluto/rea/pull/8487), [#8485](https://github.com/morluto/rea/pull/8485), [#9171](https://github.com/morluto/rea/pull/9171), [#9603](https://github.com/morluto/rea/pull/9603), [issue morluto/rea#2512](https://github.com/morluto/rea/issues/2512), [issue morluto/rea#3246](https://github.com/morluto/rea/issues/3246), [issue morluto/rea#8403](https://github.com/morluto/rea/issues/8403), [issue morluto/rea#9134](https://github.com/morluto/rea/issues/9134), [issue morluto/rea#9136](https://github.com/morluto/rea/issues/9136). Thanks @0xLLVEL, @2SinceJuly, @akshad-exe, @codebuff-team, @gensokyo-dev, @Henglie, @phucicb-hub, @wu546526. +- Add non-executing process-scenario dry runs, opt-in command timings and caller-selected reference-source exclusions. [#8469](https://github.com/morluto/rea/pull/8469), [#7042](https://github.com/morluto/rea/pull/7042), [#2630](https://github.com/morluto/rea/pull/2630), [issue morluto/rea#2443](https://github.com/morluto/rea/issues/2443), [issue morluto/rea#5484](https://github.com/morluto/rea/issues/5484), [issue morluto/rea#8398](https://github.com/morluto/rea/issues/8398). Thanks @2SinceJuly, @dhruvac29, @gensokyo-dev, @jayykernel, @matbrgz, @trackoor, @YunzhouLi-hub. +- Make resource-budget failures actionable across CLI/MCP and read per-call limits from the selected operation snapshot. [#9706](https://github.com/morluto/rea/pull/9706), [#9889](https://github.com/morluto/rea/pull/9889), [issue morluto/rea#9881](https://github.com/morluto/rea/issues/9881). +- Ship self-contained Claude Code/Codex plugin installs and a Cursor Marketplace plugin; add CodeBuddy and LM Studio setup registration. [#7514](https://github.com/morluto/rea/pull/7514), [#9878](https://github.com/morluto/rea/pull/9878), [#2492](https://github.com/morluto/rea/pull/2492), [#8611](https://github.com/morluto/rea/pull/8611), [issue morluto/rea#2490](https://github.com/morluto/rea/issues/2490). Thanks @cainiao1992, @cpruijsen, @GamerDubz, @gensokyo-dev. +- Inspect Windows Shell Link files and qualify recognized Python 3.14/3.15 pyc headers; choose Rizin decoder and map address for one-shot commands. [#7859](https://github.com/morluto/rea/pull/7859), [#8927](https://github.com/morluto/rea/pull/8927), [#8991](https://github.com/morluto/rea/pull/8991), [issue morluto/rea#8206](https://github.com/morluto/rea/issues/8206). Thanks @Entrpi, @mvanhorn, @XiaoBinGan, @xuanhieu. +- Register REA with Cline through its native MCP client settings during setup. [#10128](https://github.com/morluto/rea/pull/10128), [issue morluto/rea#10127](https://github.com/morluto/rea/issues/10127). Thanks @bramrahmadi. + +### Fixes + +- Keep UnityFS directory and payload reads within the declared bundle, reject undersized declarations, and prevent appended bytes from replacing the inventory or increasing its work budget. [58a0511660](https://github.com/morluto/rea/commit/58a051166047442b947c604c3f7ccde6707ee9df). +- Validate runtime configuration before doctor reports readiness or registration writes files; preserve the source of malformed stored settings and proposed overrides. [#10102](https://github.com/morluto/rea/pull/10102). +- Retry owned inspection descriptors before fresh process queries, preserve physical failures alongside cancellation, and retain cleanup authority until release succeeds. [#10113](https://github.com/morluto/rea/pull/10113), [#10141](https://github.com/morluto/rea/pull/10141), [#10109](https://github.com/morluto/rea/pull/10109). +- Keep distinct linker-map occurrences when source-map declarations overlap, including path spellings that normalize to the same location. [aa017c61ff](https://github.com/morluto/rea/commit/aa017c61ff3803dea3b823664ae255c4059c19d4), [f668c86271](https://github.com/morluto/rea/commit/f668c862717fd1c63c649a04709191bbe86e4479). +- Preserve remote OpenCode registrations and Hermes YAML anchor consumers instead of treating REA-like text as proof of local ownership. [#5152](https://github.com/morluto/rea/pull/5152), [issue morluto/rea#3325](https://github.com/morluto/rea/issues/3325). Thanks @coygeek, @gensokyo-dev, @xu91102. +- Reject malformed UTF-8 CDP discovery replies, preserve partial Playwright-import Evidence, and retain initial child scope when replaying WebMCP scripts. [#4524](https://github.com/morluto/rea/pull/4524), [#9543](https://github.com/morluto/rea/pull/9543). Thanks @Afloat16, @Plastic-time. +- Report unsupported filesystem paths and host-capacity failures at the responsible adb input boundary; retain local filesystem error provenance. [#6188](https://github.com/morluto/rea/pull/6188). Thanks @chordpli. +- Preserve uncertainty when JavaScript alias walks exhaust their budget, keep unisolated program-var routes unknown, and analyze first-party code before dependencies. [#9387](https://github.com/morluto/rea/pull/9387), [#6778](https://github.com/morluto/rea/pull/6778), [#9341](https://github.com/morluto/rea/pull/9341), [issue morluto/rea#8201](https://github.com/morluto/rea/issues/8201), [issue morluto/rea#9321](https://github.com/morluto/rea/issues/9321). Thanks @gongfpp, @mvanhorn, @Rfxan, @xuanhieu, @yaneyba. +- Resolve relative ESM backslash paths and exported/computed initializers; reject TLS versions and child-process literals Node itself refuses. [#4323](https://github.com/morluto/rea/pull/4323), [#5387](https://github.com/morluto/rea/pull/5387), [#9557](https://github.com/morluto/rea/pull/9557), [#9594](https://github.com/morluto/rea/pull/9594), [issue morluto/rea#4269](https://github.com/morluto/rea/issues/4269). Thanks @6eanut, @ahmed-husssain, @coygeek, @XiaoBinGan. +- Validate PE certificate alignment, name structures and RDN grouping, and distinguish legacy Windows targets before PE header admission. [#9276](https://github.com/morluto/rea/pull/9276), [#9625](https://github.com/morluto/rea/pull/9625), [#10048](https://github.com/morluto/rea/pull/10048), [#10070](https://github.com/morluto/rea/pull/10070), [issue morluto/rea#10003](https://github.com/morluto/rea/issues/10003), [issue morluto/rea#9946](https://github.com/morluto/rea/issues/9946). Thanks @AixSxT, @coygeek, @gensokyo-dev, @N0zoM1z0, @ShuaixinHuang, @wunianze666-netizen. +- Retain UTF-8 ZIP names in desktop exports, resolve nested desktop-entry IDs, and preserve reader inspection failures. [#9431](https://github.com/morluto/rea/pull/9431), [#9563](https://github.com/morluto/rea/pull/9563), [#9773](https://github.com/morluto/rea/pull/9773), [issue morluto/rea#9449](https://github.com/morluto/rea/issues/9449), [issue morluto/rea#9558](https://github.com/morluto/rea/issues/9558), [issue morluto/rea#9766](https://github.com/morluto/rea/issues/9766). Thanks @2SinceJuly, @ShuaixinHuang, @xu91102. +- Report the actual link-time kernel banner, list ELF initializers in images with COPY relocations, and leave cross-code-page shortcut-icon comparisons unknown. [#9690](https://github.com/morluto/rea/pull/9690), [#10084](https://github.com/morluto/rea/pull/10084), [#9691](https://github.com/morluto/rea/pull/9691), [issue morluto/rea#9688](https://github.com/morluto/rea/issues/9688), [issue morluto/rea#9689](https://github.com/morluto/rea/issues/9689). Thanks @Plastic-time, @thunderq10. +- Retain actionable debugger/provider failures: reconnect stale JEB MCP sessions, preserve GDB inferior-TTY checks, and report invalid IDA regex syntax. [#3754](https://github.com/morluto/rea/pull/3754), [#5539](https://github.com/morluto/rea/pull/5539), [#9544](https://github.com/morluto/rea/pull/9544), [issue morluto/rea#5099](https://github.com/morluto/rea/issues/5099). Thanks @akushonkamen, @coygeek, @flitzrrr, @Plastic-time. +- Keep missing native call-input bindings and exhausted MCP discovery pages distinct from absence. [#10088](https://github.com/morluto/rea/pull/10088), [#10017](https://github.com/morluto/rea/pull/10017), [issue morluto/rea#8358](https://github.com/morluto/rea/issues/8358), [issue morluto/rea#9995](https://github.com/morluto/rea/issues/9995). Thanks @coygeek, @gensokyo-dev, @N0zoM1z0. +- Preserve admitted EVM and pwntools replies and completed SQLite member facts through acquisition/finalization failures. [d77cf61](https://github.com/morluto/rea/commit/d77cf6186631743025a1bafb8c5a27262da6128e), [e813c4c](https://github.com/morluto/rea/commit/e813c4c344d2414d1b8dfe42a421792d91b01dcc), [669e617](https://github.com/morluto/rea/commit/669e617eec5422ebce1ab271af0fc7b51e90dc11). +- Attribute keyed-archive errors to the archive argument, distinguish launcher failures from registry errors, and validate capture limiters before starting work. [#7731](https://github.com/morluto/rea/pull/7731), [#7843](https://github.com/morluto/rea/pull/7843), [#7947](https://github.com/morluto/rea/pull/7947), [issue morluto/rea#7292](https://github.com/morluto/rea/issues/7292), [issue morluto/rea#7597](https://github.com/morluto/rea/issues/7597), [issue morluto/rea#7630](https://github.com/morluto/rea/issues/7630), [issue morluto/rea#7638](https://github.com/morluto/rea/issues/7638). Thanks @coygeek, @gensokyo-dev. +- Preserve unknown CDP coordinates and prior-hop response facts, deduplicate scenario guidance and recognize AppKit cell ownership. [#7842](https://github.com/morluto/rea/pull/7842), [#7807](https://github.com/morluto/rea/pull/7807), [#7933](https://github.com/morluto/rea/pull/7933), [#7916](https://github.com/morluto/rea/pull/7916), [issue morluto/rea#7342](https://github.com/morluto/rea/issues/7342), [issue morluto/rea#7426](https://github.com/morluto/rea/issues/7426), [issue morluto/rea#7434](https://github.com/morluto/rea/issues/7434), [issue morluto/rea#7681](https://github.com/morluto/rea/issues/7681). Thanks @coygeek, @gensokyo-dev. +- Read legacy Erlang atom tables correctly, exclude Harmony symlinks from unavailable files, and preserve uncertain JavaScript with-scope member writes. [#7844](https://github.com/morluto/rea/pull/7844), [#7886](https://github.com/morluto/rea/pull/7886), [#7914](https://github.com/morluto/rea/pull/7914), [issue morluto/rea#7418](https://github.com/morluto/rea/issues/7418), [issue morluto/rea#7545](https://github.com/morluto/rea/issues/7545), [issue morluto/rea#7602](https://github.com/morluto/rea/issues/7602). Thanks @coygeek. +- Preserve known artifact metadata without hashes, report missing Ghidra project programs as configuration errors, and retain unbacked file-offset diagnostics. [#7932](https://github.com/morluto/rea/pull/7932), [#8222](https://github.com/morluto/rea/pull/8222), [#8308](https://github.com/morluto/rea/pull/8308), [issue morluto/rea#7341](https://github.com/morluto/rea/issues/7341), [issue morluto/rea#8216](https://github.com/morluto/rea/issues/8216), [issue morluto/rea#8244](https://github.com/morluto/rea/issues/8244). Thanks @coygeek, @kaoru0822-kitauji, @macjayz. +- Scope Hopper recovery to the caller lifetime and preserve Mach-O host-slice, Godot digest, browser-resource and selected-slice distinctions. [#9905](https://github.com/morluto/rea/pull/9905), [#10016](https://github.com/morluto/rea/pull/10016). +- Retain partial OpenAPI Evidence, reject unrepresentable adb activity arguments, and preserve worker, Frida and owned-command failure/cancellation facts through cleanup. [#9908](https://github.com/morluto/rea/pull/9908), [#9918](https://github.com/morluto/rea/pull/9918), [#10055](https://github.com/morluto/rea/pull/10055), [#9963](https://github.com/morluto/rea/pull/9963), [#9964](https://github.com/morluto/rea/pull/9964). +- Decode escaped HAR, qlog and Playwright JSON strings without retaining the fragmented strings that inflated decoder heap usage. [#10139](https://github.com/morluto/rea/pull/10139), [issue morluto/rea#10132](https://github.com/morluto/rea/issues/10132). Thanks @fcumaoglu, @mecrimino. +- Preserve physical web-worker launch failures as the primary error when cancellation overlaps; retain cancellation separately from the exact launcher observation. [#10145](https://github.com/morluto/rea/pull/10145). +- Classify adb wireless-debugging mDNS serials as TCP while preserving USB precedence and unknown device kind. [#10134](https://github.com/morluto/rea/pull/10134). Thanks @rudycelekli. +- Normalize lipo’s i386 CPU spelling before Mach-O slice selection and recognize the `__chk_fail` FORTIFY handler import. [#10136](https://github.com/morluto/rea/pull/10136), [#10036](https://github.com/morluto/rea/pull/10036), [issue morluto/rea#10025](https://github.com/morluto/rea/issues/10025). Thanks @2SinceJuly, @coygeek, @rudycelekli. +- Retain process CLI cleanup owners until delivery, preserve known local retry leases alongside unknown prior cleanup, and align lifecycle boundaries with tagged cancellation facts. [#10147](https://github.com/morluto/rea/pull/10147). Thanks @wunianze666-netizen. +- Count only syntactically valid CSP nonce/hash sources when reporting browser policy. [#10135](https://github.com/morluto/rea/pull/10135). Thanks @rudycelekli. +- Reject ELF tables inside the declared header and unmatched NT_FILE mapping pathnames; keep PE imports within their declared directory bounds. [#10133](https://github.com/morluto/rea/pull/10133), [#10138](https://github.com/morluto/rea/pull/10138), [#10044](https://github.com/morluto/rea/pull/10044). Thanks @rudycelekli, @ShuaixinHuang, @wunianze666-netizen. +- Classify private nested Swift types by their own kind rather than their enclosing declaration. [#10085](https://github.com/morluto/rea/pull/10085), [issue morluto/rea#7501](https://github.com/morluto/rea/issues/7501). Thanks @BeqaKs, @Rinkia. + +### ⚠ BREAKING CHANGES + +- Settings clients must replace `effect`, `rea_restart_required`, `restart_required` and `restartRequired` with `update_mode` (`runtime`, `restart`, `parameter`) and `pending_restart`. Parameter-supplied limits cannot be changed by the runtime setter; restart-mode values retain their startup value until restart. [#9885](https://github.com/morluto/rea/pull/9885), [be20bdfb26f7](https://github.com/morluto/rea/commit/be20bdfb26f75a573a9cad49d091f5a27f8fc745), [aee1178839dd](https://github.com/morluto/rea/commit/aee1178839dddcc54de42cce6d5d91b7a913034b). Thanks @gensokyo-dev, @N0zoM1z0. +- Process and desktop callers must inspect `details.secondary_failures`/`secondaryFailures`: mixed batches keep physical/provider failures primary and retain typed cancellation with its original cause. Retained descriptors can produce `cleanup_incomplete`; follow the returned recovery instead of treating it as ordinary cancellation. Custom adapters must consume owner-issued inspection/sampling facts and retain their cleanup scopes until release succeeds. [#10141](https://github.com/morluto/rea/pull/10141), [#10113](https://github.com/morluto/rea/pull/10113), [#10109](https://github.com/morluto/rea/pull/10109). +- `rea mcp add --command` now accepts a local stdio launcher only: HTTP(S) executable URLs are rejected before settings writes, and package acquisition is removed. Configure remote transports in each client’s native settings and install/select the local launcher before registration. [#10102](https://github.com/morluto/rea/pull/10102). +- Runtime-instance graph identities now require `identity.capture_evidence_id` in addition to the capture digest and runtime key. Node IDs digest that identity, so regenerate reconciliation Evidence and rebuild node-keyed lookups even when the digest and runtime key are unchanged. [#10063](https://github.com/morluto/rea/pull/10063). +- Retained process symlinks require their stored target bytes; recapture legacy observations that only described a link without retaining its target. [#10082](https://github.com/morluto/rea/pull/10082). +- Function dossiers must record Swift literal inventory and its omissions together. Regenerate one-sided observations through a canonical provider; both-absent unsupported observations remain valid. [#10068](https://github.com/morluto/rea/pull/10068). +- Conformance manifest schema v2 separates exact string markers from fragments and rejects the old ambiguous `strings` field. Regenerate unversioned fixtures with `npm run build:fixtures`. [#9977](https://github.com/morluto/rea/pull/9977). +- Unavailable native/BEAM/Go/Rust view collections return `items.rows: null`, `coverage.status: "unavailable"`, `coverage.total: null` and `coverage.exhausted: false`; recorded empty collections still return `rows: []`. Refresh schemas, stop paging unavailable data and inspect `unknowns`; older saved views retain their recorded facts. [#9893](https://github.com/morluto/rea/pull/9893), [#8291](https://github.com/morluto/rea/pull/8291), [issue morluto/rea#8276](https://github.com/morluto/rea/issues/8276). Thanks @Xinglan233. +- Desktop witnessing requires the current generated verifier: re-export old bundles using their original Evidence/task inputs. Pre-6.9 captures missing required `state.baseline_non_files` are rejected before state inspection, drafting or export; capture the application again to obtain contemporaneous SQLite member facts. [#9898](https://github.com/morluto/rea/pull/9898), [#9470](https://github.com/morluto/rea/pull/9470). +- New browser captures record `save: []` for request actions that save nothing, changing scenario/Evidence digests. Keep historical digests with historical captures and use freshly recorded digests for new ones. [#9896](https://github.com/morluto/rea/pull/9896). +- Selected SQLite rows require `row_offset` and `next_row_offset`; `rows.order` is `rowid`, `primary_key` or `unspecified`. A null next offset means either no continuation or no stated order: an unordered sample can still have `truncated: true`. Inspect both `order` and `truncated` before concluding the sample is complete. [#9331](https://github.com/morluto/rea/pull/9331), [issue morluto/rea#8234](https://github.com/morluto/rea/issues/8234). Thanks @2SinceJuly, @555aaditya. +- Windows entropy Evidence now uses the admitted filesystem path spelling, so fresh analysis of a differently cased caller path can change `evidence_id`. Invalidate or re-key cached associations against the fresh Evidence, retaining old IDs only for their original observations. [#9393](https://github.com/morluto/rea/pull/9393). Thanks @HusnainMaroof. +- `caller_input_paths` values may be ordered arrays of strings as well as strings. Update strict consumers to preserve repeated selections. [#9626](https://github.com/morluto/rea/pull/9626), [#9624](https://github.com/morluto/rea/pull/9624). +- `observe_javascript_runtime` adds required `execution_context_id` fields to scripts and contexts. `context_key` is an opaque capture-local lifetime identity, not a reusable protocol ID, and Evidence identities change. Refresh schemas and recapture when new lifetime associations are needed. [#9471](https://github.com/morluto/rea/pull/9471), [issue morluto/rea#3382](https://github.com/morluto/rea/issues/3382). Thanks @coygeek. +- Refresh cached `inspect_address_context` schemas: unavailable facets may carry typed input or resource-constraint errors while successful sibling facets remain available. [#8444](https://github.com/morluto/rea/pull/8444), [#8424](https://github.com/morluto/rea/pull/8424), [#8419](https://github.com/morluto/rea/pull/8419). +- `analyze_function`/`trace_native_values` require `native_value_flow.limitations` on available and unavailable variants. Ghidra memory effects cover explicit high-p-code `LOAD`/`STORE` operations only; empty effects do not prove no memory access. The `value_flow_effect_scope` profile commitment invalidates older snapshots: retain embedded historical Evidence, reopen without the snapshot and save a fresh one. [#8651](https://github.com/morluto/rea/pull/8651). +- Ghidra byte searches require `skipped_overlays`; loaded overlays no longer count as not loaded, and adjacent initialized blocks are searched with explicit coverage. Reopen targets and save fresh analysis snapshots after the profile/search-policy changes; historical Evidence stays importable. [#8608](https://github.com/morluto/rea/pull/8608), [#8376](https://github.com/morluto/rea/pull/8376), [#8840](https://github.com/morluto/rea/pull/8840), [issue morluto/rea#8374](https://github.com/morluto/rea/issues/8374), [issue morluto/rea#8563](https://github.com/morluto/rea/issues/8563), [issue morluto/rea#8607](https://github.com/morluto/rea/issues/8607). +- `compare_functions` adds `function_match.method: "same-evidence"` when both inputs authenticate to one Evidence ID and entry comparison is unavailable. Accept the new matched variant, retain unknown dimensions and do not infer complete equivalence; one observation cannot have contradictory changed dimensions or hashes. [#8442](https://github.com/morluto/rea/pull/8442), [issue morluto/rea#8367](https://github.com/morluto/rea/issues/8367). +- Kuna `analyze_function` can return `native_value_flow: {available: false, reason, limitations}` instead of null. Check `available` and preserve the provider reason; null means procedure-scoped unrecorded unknown, not confirmed absence. The workflow-profile digest changes: older trace Evidence remains history but must be rerun to satisfy current replay. [#8785](https://github.com/morluto/rea/pull/8785), [issue morluto/rea#8783](https://github.com/morluto/rea/issues/8783). +- The opt-in hot/cold MCP catalog no longer preloads `inspect_analysis_view`. Discover it before use or batch it with its producer; the default full catalog remains available. [#9151](https://github.com/morluto/rea/pull/9151). Thanks @gensokyo-dev. +- `batch_decompile` and retained batch views now use `items[].status: "unavailable"` with `reason: "no_pseudocode"` for null pseudocode, replacing the former `error`/`capability_unavailable` item. Empty or non-text values remain `status: "error"` with `unreadable_output`. Both count toward `failed`; preserve item limitations and accept historical error items. [#8737](https://github.com/morluto/rea/pull/8737), [issue morluto/rea#8736](https://github.com/morluto/rea/issues/8736). +- `import_evidence_bundle`/CLI `evidence-import` now reject snapshot-shaped JSON with `invalid_request` instead of `evidence_integrity_mismatch`. Restore it with `open_binary.snapshot_path` or a compatible CLI `--snapshot`; bundle imports require a canonical bundle from `export_evidence_bundle`. [#8867](https://github.com/morluto/rea/pull/8867). +- REA-launched Chromium keeps its sandbox. If launch fails on root/container hosts, first enable host sandbox support, such as a suitable non-root user or namespace/setuid facilities. The explicit `REA_BROWSER_NO_SANDBOX=true` fallback disables Chromium’s sandbox and does not establish an REA isolation boundary. [#8738](https://github.com/morluto/rea/pull/8738), [issue morluto/rea#8722](https://github.com/morluto/rea/issues/8722). Thanks @chordpli, @hkeysai. +- Fresh objdump Evidence changes provider identity from `gnu.objdump`/`GNU objdump` to `{id: "objdump.command", name: "objdump command", version: null}`; launch errors use the same ID and architecture-list subjects may be null. Update provider-keyed caches/readers and retain the selected executable parameters without assuming GNU semantics; historical Evidence stays readable. [#8824](https://github.com/morluto/rea/pull/8824), [issue morluto/rea#8823](https://github.com/morluto/rea/issues/8823). +- Kuna verification policy is separate from analysis identity. Earlier snapshots and resumable directory exports are incompatible even with the same executable. Preserve old files, reopen without the snapshot and save a fresh one or choose a new export directory; the [Kuna guide](https://github.com/morluto/rea/blob/main/docs/kuna-provider.md) explains extracting/importing embedded Evidence as history. [#8699](https://github.com/morluto/rea/pull/8699). +- `inspect_analysis_view` rejects mismatched native parent predicates with `invalid_request` at `source.predicate_type`: function/inventory/observation views require `rea.analysis`, and matching views require `rea.native-function-matching`. Select the original correctly typed Evidence or rerun its producer; patching an existing predicate invalidates its identity. [#8451](https://github.com/morluto/rea/pull/8451). +- `trace_feature` can succeed when xrefs exist but owner lookup is unavailable. Accept `references[].containing_procedure.status: "unavailable"` with provider/reason fields instead of requiring a `found` member, and inspect `residual_unknowns`; `truncated: false` does not establish resolved ownership. [#8368](https://github.com/morluto/rea/pull/8368). +- `close_binary` retains investigation records; use `reset_investigation` to clear them. Cross-process recovery requires an explicitly acknowledged Evidence-bundle checkpoint. [#8361](https://github.com/morluto/rea/pull/8361), [issue morluto/rea#8347](https://github.com/morluto/rea/issues/8347). Thanks @gensokyo-dev. +- `compare_functions` adds the matched `function_match.method: "same-entry"` variant with required `entry_address` when authenticated artifact, architecture, mapping, slice and entry commitments agree despite a rename. Refresh schemas and keep name/identity changes separate from entry correspondence. [#8263](https://github.com/morluto/rea/pull/8263), [issue morluto/rea#8213](https://github.com/morluto/rea/issues/8213). Thanks @gensokyo-dev. +- `inspect_native_load_image` NativeAOT `metadata_recovery` uses a status-discriminated union: complete reports require `reason: null`; partial/not-applicable reports carry `{code, ...}` instead of prose reasons. Branch on codes and their fields while preserving historical/optional-extension strings. Invalid budgets now produce typed input/resource errors. [#8053](https://github.com/morluto/rea/pull/8053). +- `trace_javascript_semantics` adds `influences` edges and moves direct literal-argument seeds from call-site to expression nodes. Relevant unknown dependencies can change `found` to `partial`: handle that status and inspect unknowns. Reanalyze retained application graphs to obtain the new edges; old graphs stay readable. [#7939](https://github.com/morluto/rea/pull/7939), [issue morluto/rea#7500](https://github.com/morluto/rea/issues/7500). Thanks @Rinkia. +- `inspect_managed_members` changes `signature_resolution` from `type-names-v1` to `type-names-v2` and appends readable names to signature operands, such as `class:4 (Fixture.Program)`. Branch on the resolution version, accept annotated v2 strings and preserve historical v1/null displays. Signature digests are unchanged; `InternalCall` methods remain runtime-provided boundaries. [#5309](https://github.com/morluto/rea/pull/5309), [#9547](https://github.com/morluto/rea/pull/9547), [issue morluto/rea#5149](https://github.com/morluto/rea/issues/5149). Thanks @elricfd, @gensokyo-dev, @ln-bodicherla, @Plastic-time. +- MCP calls default to 1,024 combined array elements/object members; excess input is rejected before dispatch with nonretryable `resource_constraint`, `resource: "transport"` and `reported_limits.max_input_elements`. For larger inline calls, set `REA_MCP_MAX_INPUT_ELEMENTS` to a digit-only positive decimal safe integer (1–9007199254740991) and restart, or select retained/file inputs. Fractional/exponent spellings are invalid; inputs are never truncated. [#7905](https://github.com/morluto/rea/pull/7905), [issue morluto/rea#7882](https://github.com/morluto/rea/issues/7882). Thanks @gensokyo-dev. +- `inspect_macho` text names/paths can be null for non-UTF-8 bytes, with `name_bytes_hex`, `segment_bytes_hex` and `path_bytes_hex` alternatives; unsafe numeric sizes/offsets/alignments can be null with exact companion fields, and delayed-init `options` are numeric. Refresh schemas and preserve these facts; absent byte fields in older Evidence remain unrecorded. [#7952](https://github.com/morluto/rea/pull/7952), [issue morluto/rea#7391](https://github.com/morluto/rea/issues/7391). Thanks @coygeek. +- Environment file-source errors move from the generic `evidence` issue path to `capture` for `environment-build` and `source.path` for environment bundle build/export. Missing/non-file/invalid UTF-8/JSON sources return `invalid_request` with `invalid_value`/`invalid_format` issues and `inspect_input_contract` recovery; repair the selected file. [#7900](https://github.com/morluto/rea/pull/7900), [issue morluto/rea#7523](https://github.com/morluto/rea/issues/7523). Thanks @coygeek. +- Selected unpaired UTF-16 surrogates now make TOON, Markdown, CSV and TSV output fail with `invalid_request` and a nonzero exit even after a successful operation; Markdown also refuses NUL. Use `--format json` or `--format yaml` to preserve these values rather than accepting substituted text. [#7852](https://github.com/morluto/rea/pull/7852), [issue morluto/rea#7592](https://github.com/morluto/rea/issues/7592), [issue morluto/rea#7593](https://github.com/morluto/rea/issues/7593). Thanks @coygeek. +- Reconstruction `evidence_bundle` inputs reject authenticated standalone records as `invalid_request` with field-level issues instead of accepting/misclassifying them as damaged bundles. Bundle-file import/export/comparison reports `invalid_request`/`invalid_input` with `details.reason: "wrong-kind"`. Supply a canonical bundle from `export_evidence_bundle`; tampered data remains an integrity failure. [#7895](https://github.com/morluto/rea/pull/7895), [issue morluto/rea#7562](https://github.com/morluto/rea/issues/7562). Thanks @coygeek. +- Environment coverage can use `method-replay` for non-GET safe reads. Clock-generating write plans without a global clock anchor now return `served: false`, `reason: "unknown-clock"` instead of being served. Extend reason handling and recapture usable start times/completed durations before replaying those writes. [#7834](https://github.com/morluto/rea/pull/7834), [63220edcc3b4](https://github.com/morluto/rea/commit/63220edcc3b47d44e72a7d77518172d81961e67a), [issue morluto/rea#7387](https://github.com/morluto/rea/issues/7387). Thanks @coygeek. +- Ghidra returns `not-in-listing` for in-memory addresses lacking listed instructions or defined data, replacing the former `undecodable` interpretation. Accept the new status and recreate snapshots after the raw-profile change; retain old embedded Evidence as history. [#7823](https://github.com/morluto/rea/pull/7823), [issue morluto/rea#7490](https://github.com/morluto/rea/issues/7490). Thanks @Entrpi. +- `capture_process_scenario`/CLI process capture rejects `columns: 1` before target launch; update both initial terminal widths and every resize to at least 2. Sensitive interaction `data` is empty with `sensitive`/`input_bytes`, and raw echoes are redacted. Recapture both sides before comparing older private-input Evidence. [#7848](https://github.com/morluto/rea/pull/7848), [#7804](https://github.com/morluto/rea/pull/7804), [issue morluto/rea#7582](https://github.com/morluto/rea/issues/7582), [issue morluto/rea#7782](https://github.com/morluto/rea/issues/7782). Thanks @coygeek, @gensokyo-dev. +- Managed setup registrations bind the selected absolute runtime and REA entry script, including package-runner cache paths. Keep that installation available; unknown registrations need confirmed manual repair. Setup no longer returns `prewarm` or emits its progress events. [c77735fa83a6](https://github.com/morluto/rea/commit/c77735fa83a66552ec45eef435ab3bb36026ecfe). Thanks @gensokyo-dev. +- macOS Hopper launch paths/arguments reject double quotes, backslashes and line breaks before handoff. Select literal-safe prepared paths/loader arguments or a compatible provider. [#7732](https://github.com/morluto/rea/pull/7732), [issue morluto/rea#7727](https://github.com/morluto/rea/issues/7727). Thanks @gensokyo-dev. +- New JavaScript application graphs omit the derived package `renderer` property. Use `renderer_declarations` for source fields and package-load edges for the selected candidate; historical Evidence remains readable. [5cf7133f823b](https://github.com/morluto/rea/commit/5cf7133f823bce2a3e42a6e1d0c8418e5ff9908d). +- Replace Cutter `--json=true/false` with `--json-output=true/false`; bare `--json` still selects CLI result formatting. Replace `rea compare-bundles` with `rea compare`; MCP `compare_bundles` is unchanged. [567ea4b1e8bb](https://github.com/morluto/rea/commit/567ea4b1e8bb7dda67563d06f1b4977c2d92995a), [3515b262218f](https://github.com/morluto/rea/commit/3515b262218f2d4ba94ce6a7bda9766747b3d84d). +- JEB engine refusals report `execution_failure` rather than `unsupported_target`; inspect retained upstream diagnostics for recovery. [c4cdb7658b0e](https://github.com/morluto/rea/commit/c4cdb7658b0eb5ef16b30bd8127479bce8c21233). +- ASAR file occurrences may contain `unpacked: false`. Accept an optional boolean; absent historical fields remain unknown. [60834e391c3f](https://github.com/morluto/rea/commit/60834e391c3f81eb2343eba288b735c3bf3bde61). +- Non-loopback MCP HTTP binds require `MCP_ALLOWED_HOSTS` or `rea mcp --http --allowed-hosts`. Bundle names must be unchanged HTTP hostnames within the 63-octet DNS-label limit. [#7172](https://github.com/morluto/rea/pull/7172). Thanks @DeryFerd, @gensokyo-dev. +- `binary_session {}` is compact by default and omits provider availability diagnostics/remediation, target-support diagnostics/capabilities and tool-group surface/effects/annotations. Request `{"detail":"complete"}` for these facts and recovery guidance. [#7127](https://github.com/morluto/rea/pull/7127), [issue morluto/rea#7109](https://github.com/morluto/rea/issues/7109). Thanks @kaoru0822-kitauji. +- Native input errors now include `details.operation` and field-level `details.issues`. Supply a nonempty `trace_native_values.procedure`; CLI `trace-native-values` rejects an empty procedure before opening the target as `VALIDATION_ERROR` with `fieldErrors`, while MCP reports `invalid_request` at `procedure`. [#7889](https://github.com/morluto/rea/pull/7889), [issue morluto/rea#7572](https://github.com/morluto/rea/issues/7572). Thanks @coygeek. +- Readable JavaScript members that normalize to one logical path now stop `analyze_javascript_application` with `artifact_operation_failed`, `details.reason: "path"` and a partial inventory instead of selecting one occurrence. Inspect the inventory and analyze a copy without collisions; all-unavailable colliding sources remain unknown. [#7864](https://github.com/morluto/rea/pull/7864), [issue morluto/rea#7626](https://github.com/morluto/rea/issues/7626). Thanks @coygeek. +- `trace_web_module_imports` with an empty/relative `REA_BROWSER_EXECUTABLE` now reports `capability_unavailable` with `invalid_browser_executable` instead of `missing_browser_executable`, retaining `details.diagnostics.executable`. Set an absolute Chromium path; an unset selection still means missing. [#7903](https://github.com/morluto/rea/pull/7903), [issue morluto/rea#7639](https://github.com/morluto/rea/issues/7639). Thanks @coygeek. +- Unresolvable `import-reference-source` roots, capture scenario files and web-network capture/Protobuf descriptor paths (`ELOOP`/`ENAMETOOLONG`) now report `invalid_request`/`invalid_input` with responsible field/host-code issues rather than generic execution/unreadable-output failures. Repair the symlink chain or choose a shorter path. [#7847](https://github.com/morluto/rea/pull/7847), [#7814](https://github.com/morluto/rea/pull/7814), [issue morluto/rea#7607](https://github.com/morluto/rea/issues/7607), [issue morluto/rea#7636](https://github.com/morluto/rea/issues/7636). Thanks @Abelo9996, @coygeek. +- `close_binary` with `snapshot_path` on a profileless/archive target now returns nonretryable `capability_unavailable` instead of `evidence_integrity_mismatch`, writes no snapshot and leaves the session open. Export needed Evidence, then close again without `snapshot_path`. [#7837](https://github.com/morluto/rea/pull/7837), [issue morluto/rea#7311](https://github.com/morluto/rea/issues/7311). Thanks @coygeek. +- adb local-file refusals occur before device commands: missing/non-file/uninspectable `local_path`/`apk_path` and file-blocked `output_directory` return `invalid_request` with field issues/host codes; output-producing calls formerly used `unreadable_output`. Supply regular source files and a directory path whose parents are directories. [#7885](https://github.com/morluto/rea/pull/7885), [issue morluto/rea#7549](https://github.com/morluto/rea/issues/7549), [issue morluto/rea#7550](https://github.com/morluto/rea/issues/7550). Thanks @coygeek. +- Evidence writes failing with `EFBIG`, `ENOSPC` or `EDQUOT` now report nonretryable `resource_constraint`, `details.reason: "storage-limit"`, path and optional `system_code` instead of `execution_failure`/`io`. Raise file-size allowance or free space/quota before retrying; a failed staged-file cleanup remains `cleanup_incomplete`. [#7887](https://github.com/morluto/rea/pull/7887), [issue morluto/rea#7573](https://github.com/morluto/rea/issues/7573). Thanks @coygeek. +- PE signers add optional nullable `unsigned_attribute_oids`: fresh null means absent, an OID array means present, and omission in old Evidence is unrecorded. Unsigned attributes produce `coverage.status: "partial"` because nested signatures/timestamp contents remain undecoded; accept the new field and limitations. [#7920](https://github.com/morluto/rea/pull/7920), [issue morluto/rea#7767](https://github.com/morluto/rea/issues/7767). Thanks @Rinkia. +- Valid ASN.1 exceeding certificate nesting/OID allowances now returns nonretryable `resource_constraint` rather than `invalid_request`/`invalid_input`, with `max_asn1_depth`/`max_oid_bytes`. These format/resource bounds have no runtime override; retain the diagnostics and use an independently suitable parser when necessary. [#9932](https://github.com/morluto/rea/pull/9932). +- `trace_call_path`/`build_call_path` require discovery and observed-result fields in `search_scope`. An exhausted observed graph can still yield `goal_status: "unknown"` when provider discovery is incomplete. Refresh result schemas and workflow-profile expectations instead of equating graph exhaustion with complete discovery. [#8443](https://github.com/morluto/rea/pull/8443). +- `inspect_native_instruction` adds `containing_instruction` for `not-instruction-boundary` and `containing_data` for `data`, with address/extent/identity/provenance. Accept these facts; omission in old Evidence is unrecorded. The Ghidra profile changes: reopen and save a fresh snapshot. [#8777](https://github.com/morluto/rea/pull/8777). +- `trace_native_values` adds required `page_truncated` and tagged `traversal` coverage. `truncated` combines page omission with traversal truncation; exactly filling a budget alone no longer proves truncation. Inspect page coverage before fetching another page and traversal reason before raising budgets. [#8309](https://github.com/morluto/rea/pull/8309), [issue morluto/rea#8283](https://github.com/morluto/rea/issues/8283). Thanks @kaoru0822-kitauji. +- `batch_decompile.addresses` has a separate hard ceiling of 20,000 entries. Split larger batches into calls of at most that size; increasing the configurable MCP transport allowance cannot remove this operation limit. [#5937](https://github.com/morluto/rea/pull/5937), [issue morluto/rea#5930](https://github.com/morluto/rea/issues/5930). Thanks @dakjdakd. +- `close_binary` can retire the target while retaining cleanup owners: `cleanup_incomplete` may have `recovery.kind: "retry_cleanup"` despite `retryable: false`. Keep the same connection open and call `close_binary` again without `snapshot_path` to retry owned cleanup. [#8329](https://github.com/morluto/rea/pull/8329), [issue morluto/rea#8211](https://github.com/morluto/rea/issues/8211). Thanks @kaoru0822-kitauji. +- Unconfirmed cleanup in `inspect_address_context`, `get_call_graph` or `trace_call_path` now produces tool-level `cleanup_incomplete` rather than a successful partial result or cancellation. Keep admitted partial Evidence and follow the returned same-session cleanup recovery. [#8417](https://github.com/morluto/rea/pull/8417), [#8516](https://github.com/morluto/rea/pull/8516), [issue morluto/rea#8369](https://github.com/morluto/rea/issues/8369), [issue morluto/rea#8416](https://github.com/morluto/rea/issues/8416). Thanks @kaoru0822-kitauji. +- `inspect_ntfs_journal` omits detailed `mftMetadata.record_headers` by default and leaves continuation at the first omitted record. Select `mft_record_limit` from 1 to 32 when those details are needed; inventory counts and explicit coverage remain inline. [1a8a9b749a](https://github.com/morluto/rea/commit/1a8a9b749a86e4b065a6b3ee6b8bad3b2761bac6). Thanks @gensokyo-dev, @N0zoM1z0. +- Desktop state directories now use `application.state_directories[].exists_at_start: null` plus `existence_error` when inspection fails (for example, access denial). Accept the tri-state field and preserve unknown instead of treating it as absence. [#9899](https://github.com/morluto/rea/pull/9899). + +Full contribution record: [1848 commits and 1073 merged PRs](https://github.com/morluto/rea/blob/rea-agents-6.9.0/docs/releases/6.9.0.contributions.json). ## [6.8.0](https://github.com/morluto/rea/compare/rea-agents-6.7.0...rea-agents-6.8.0) (2026-10-25) diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index cbd5b1a084..8f47911f66 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -1927,7 +1927,7 @@ terminal, use the package runner at the version the plugin pins: ```bash -npx -y rea-agents@6.8.0 doctor --provider ghidra --json +npx -y rea-agents@6.9.0 doctor --provider ghidra --json ``` @@ -1960,7 +1960,7 @@ therefore runs the published package instead of a local build: "mcpServers": { "rea": { "command": "npx", - "args": ["-y", "rea-agents@6.8.0", "mcp"] + "args": ["-y", "rea-agents@6.9.0", "mcp"] } } } diff --git a/docs/releases/6.9.0.contributions.json b/docs/releases/6.9.0.contributions.json new file mode 100644 index 0000000000..117106ac3d --- /dev/null +++ b/docs/releases/6.9.0.contributions.json @@ -0,0 +1,56495 @@ +{ + "schemaVersion": 1, + "repository": "morluto/rea", + "version": "6.9.0", + "base": "160d821ac9a0310afcb8d1fc427862dd6508add5", + "target": "3a36b3e6d6ac8895358060ae7182cb8931daf5a7", + "commits": [ + { + "sha": "bc143125edd223b7e0d315d5ea7efdc270c29f9e", + "subject": "fix(release): reject missing manifest release boundaries", + "body": "fix(release): reject missing manifest release boundaries\n", + "parents": ["160d821ac9a0310afcb8d1fc427862dd6508add5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "fc43e285eaae2155d32e2ca0ab5d2181a4e2f1b5", + "subject": "feat(browser): retain compact scenario summaries and selected views (#7120)", + "body": "feat(browser): retain compact scenario summaries and selected views (#7120)\n\nRetain complete browser scenario Evidence while delivering compact summaries and selected step, event, transaction and text views through shared CLI/MCP workflows. Preserve initial CLI failures across cleanup retries and validate with real Chromium/TodoMVC.\n\nCo-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["bc143125edd223b7e0d315d5ea7efdc270c29f9e"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "Kaoru0822", + "email": "208281322+kaoru0822-kitauji@users.noreply.github.com", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7120] + }, + { + "sha": "a8e5eaf1aa93a2611d1fa4c9b24c807f941e51c6", + "subject": "fix(macho): derive the runtime name of each Mach-O symbol (#7105)", + "body": "fix(macho): derive the runtime name of each Mach-O symbol (#7105)\n\ninspect_macho reported only the symbol-table spelling (`_main`), while\nLLDB, dlsym and observe_native_calls use the runtime spelling (`main`).\nPassing a static name as a breakpoint silently selected a different\nfunction, so results from the two tools could not be joined by name.\n\nKeep `name` as the exact symbol-table fact and add a derived\n`runtime_name` to every export and import row, produced by one shared\nMach-O symbol-name owner. Managed P/Invoke verification now uses the\nsame owner instead of its own underscore stripping.\n\nFixes #5298\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["fc43e285eaae2155d32e2ca0ab5d2181a4e2f1b5"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7105] + }, + { + "sha": "0eb3919d69c98f9f31b3b8b2ee5d389c3df6e828", + "subject": "fix(artifacts): admit raw UDRW disk images (#7106)", + "body": "fix(artifacts): admit raw UDRW disk images (#7106)\n\n* fix(artifacts): admit raw UDRW disk images\n\nRaw (UDRW, UDTO) disk images have no UDIF koly trailer, so target\nadmission and root inventory both refused them as unsupported binaries.\nRecognize disk images in one domain owner (koly trailer, GPT, Apple\npartition map, MBR, or an unpartitioned HFS+/HFSX volume header) that\nboth boundaries consume.\n\nhdiutil reports \"has no checksum\" for these images; the native reader\nnow treats that status line as an explicit absent checksum, records the\nnonzero verify command, attaches read-only, and reports that integrity\nwas not verified. Checksum mismatches and unrecognized images are still\nrefused.\n\nPositional range reads used by these probes now fill until end of file\nso short host reads cannot hide a signature.\n\nFixes #5687\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(artifacts): read disk image signature windows at the recognizer\n\nTarget admission passed its first unfilled 4 KiB read to the raw-image\nchecks, so a short host read could hide a GPT, APM, MBR or HFS+\nsignature that inventory (which fills its prefix) still observed. The\nrecognizer now reads its own leading window through the caller's\nfilling positional read, and target admission fills its format-probe\nprefix as well. The controlled short-read regression now covers target\nadmission alongside inventory.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["a8e5eaf1aa93a2611d1fa4c9b24c807f941e51c6"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7106] + }, + { + "sha": "58a5275aa2247b961cb249ccbe4a98adbb706934", + "subject": "fix(mcp): advertise reduced array elements with Gemini-compatible item types (#7107)", + "body": "fix(mcp): advertise reduced array elements with Gemini-compatible item types (#7107)\n\nReduced compact input schemas gave every array property an any-value item\nschema, a six-member type list beside nested `items`. Gemini function\ndeclarations accept `items` only beside the single `array` type, so every\nrequest through a Gemini-backed client failed with\n`properties[functions].items.items: field predicate failed: $type == Type.ARRAY`.\n\nReduced array properties now advertise the element types their canonical item\nschemas accept. Unknown, tuple, and mixed array elements use the empty item\nschema, and properties that may be arrays or another type list typed anyOf\nbranches. An inline `not: {}` keeps the empty schema. The compact catalog test\nnow rejects `items` beside a non-array type as well as untyped item unions.\n\nFixes #5201\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["0eb3919d69c98f9f31b3b8b2ee5d389c3df6e828"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7107] + }, + { + "sha": "cc2656be8d8ff335283cc3d43910ca85ce519d29", + "subject": "perf(native): charge function matching for the copies it makes (#7108)", + "body": "perf(native): charge function matching for the copies it makes (#7108)\n\n* perf(native): charge matching for what it copies, not borrowed retained inventories\n\nNative function matching deep-walked every retained list_procedures record\nat about 2.8 KB per Ghidra-shaped row, although the session ledger lends\nthose immutable records without a copy, and charged each inventory's one\nEvidence ID once per function. The report and Evidence copies of every\nemitted member were not charged at all.\n\nCharge each inventory row before parsing for the member it becomes,\nincluding its report and Evidence copies, charge the shared inventory ID\nonce, and skip the walk only for borrowed immutable inventories and closure\nrecords that matching never parses. Inline Evidence, bundle records and\nselected observations keep their existing charges. Retained references now\nfit about 22,000 rows per side instead of 10,000, and an oversized side is\nrefused before its rows are parsed.\n\nRefs #6406\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): charge the envelope of borrowed matching inputs\n\nBorrowed inventories skipped admission entirely, but matching copies their\nlimitations into the report and Evidence and digests their profile, so a\nretained inventory with few rows and large limitations escaped the\nallowance. Charge every envelope field and leave only the result payloads,\nwhich row charging covers or matching never parses, uncharged.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["58a5275aa2247b961cb249ccbe4a98adbb706934"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7108] + }, + { + "sha": "d32d9f29020e54b684dcf1a0f39c5b4d9e8637ce", + "subject": "fix(lldb): keep the bridge's no-target proof through interruption (#7111)", + "body": "fix(lldb): keep the bridge's no-target proof through interruption (#7111)\n\nWhen cancellation or the deadline interrupted LLDB after it had published\nits bridge result, the tracer never read that result, so an explicit\n`target_process_created: false` (or `target_process_exit_observed: true`)\nwas lost. The run kept a `native-target:unknown` marker that no cleanup\nretry could release, wedging the tracer for every later trace.\n\nRead the published result once LLDB's process group is stopped, even for\nan interrupted run, and apply the same target-gone proof in cleanup retry.\nCancellation or timeout stays the primary outcome; a created target, a\ntruncated result, or a missing PID alone stays unresolved.\n\nFixes #5385\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["cc2656be8d8ff335283cc3d43910ca85ce519d29"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7111] + }, + { + "sha": "aa79f59478c6a912823d18136d2e116a60f43bcd", + "subject": "fix(javascript): bind defaulted and destructured Webpack factory roles (#7117)", + "body": "fix(javascript): bind defaulted and destructured Webpack factory roles (#7117)\n\n* fix(javascript): bind defaulted and destructured Webpack factory roles\n\nA Webpack factory whose module parameter was defaulted (`e = {}`) or\ndestructured (`{exports: x}`) reported an exact empty export list with\ncomplete coverage, because roles were taken only from plain identifiers.\n\nBind factory roles once, by position, in javascriptBundlerFactoryRoles.\nDefaulted module/exports parameters keep their role (the convention always\nsupplies the argument), `{exports: alias}` binds the alias to\nmodule.exports, and a repeated sloppy parameter name binds its last\nargument. Other role patterns (rest, array, nested or computed keys, a\nnon-identifier loader) receive no role and count as an unknown finding,\nso the file's analysis is partial instead of claiming no exports. The\nexport collector, the factory require name and the standalone bootstrap\nexternals all use these parsed roles.\n\nFixes #7113\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(javascript): keep factory receivers through unordered reads\n\nA defaulted role parameter kept the unused default in the binding facts\npassed to write ordering, so a receiver read inside a loop, nested block\nor closure was unresolved and its export silently dropped while the\nmodule stayed complete.\n\nThe role owner now removes defaults the calling convention never runs\nbefore ordering. Separately, an export-shaped write through a role\nbinding whose read stays unordered now counts as an unknown finding\ninstead of being dropped, so an incomplete list is never reported as\ncomplete.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(javascript): treat never-run factory parameter defaults as dead code\n\nRemoving unused defaults from binding facts let writes inside a default\nexpression reach the export collector: `(e = {}, t = (() => {\ne.exports.ghost = 1; })())` reported `ghost` although Webpack supplies\nboth arguments. Loader calls in such defaults also produced require\nreferences and async chunk keys.\n\nThe role owner now records the default of every role parameter, any\nbinding pattern included, as never run. The export collector, the\nasync-chunk walk and the static source traversal skip those subtrees,\nso they yield no exports, references or chunk keys. Defaults of later,\nnon-role parameters still run and are still reported.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["d32d9f29020e54b684dcf1a0f39c5b4d9e8637ce"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7117] + }, + { + "sha": "7336a566ace2f9d1412f78b0c56c2651b9b169cd", + "subject": "fix(mcp): fit every advertised input schema within the 64 KiB client limit (#7119)", + "body": "fix(mcp): fit every advertised input schema within the 64 KiB client limit (#7119)\n\n* fix(mcp): fit every advertised input schema within the 64 KiB client limit\n\nClaude Desktop drops a local connector tool whose compact-JSON input\nschema exceeds 64 KiB. The full input profile advertised\ncompare_web_captures at 171,867 bytes and inspect_analysis_view at\n71,632 bytes, because the self-contained projection inlines the\ncomplete producer capture schemas once per side.\n\nThe full advertisement now fits the limit at its producing boundary.\nA property whose schema repeats an earlier sibling's points at it, and\nschemas below the deepest instance level that fits are summarized as\ntheir types, size constraints and descriptions. Every rewrite widens the\nadvertisement through the existing relaxation rules for oneOf, not,\nif/then/else, contains and unevaluated keywords, so canonical inputs\nstay accepted and the canonical contract still validates every call.\nSchemas within the limit are unchanged, and the compact profile is\nstill presented from the complete projection.\n\nNumeric const and enum literals are also relaxed in the advertisement,\nlike boolean literals, since Gemini accepts only string enum members.\n\nFixes #4081\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(mcp): keep fitted input summaries widening and at the deepest fitting level\n\nArray summaries took item types only from `items`, so a tuple such as\n`{prefixItems: [{type: string}], items: {type: number}}` was advertised\nas a number array that rejected `[\"a\", 1]`. Item types now include tuple\npositions from `prefixItems`, a draft-07 `items` array, and\n`additionalItems`, and stay unconstrained when later elements are open.\n\nA summary can also be longer than the schema it replaces (a nullable\narray becomes an anyOf), so candidate size is not monotone in the\nretained depth and stopping at the first overflow could skip a deeper\ncandidate that fits. A schema is now kept whole when its summary is not\nsmaller, and fitting searches from the deepest level down.\n\nProperty tests check that every summary accepts what its schema accepts\nover every catalog input subschema and synthetic tuples, and that the\nfitted schema is the deepest fitting candidate. The browser comparison\nboundary test now expects a malformed `after` capture to be rejected\ncanonically, since `after` is advertised as the same schema as `before`;\nthe same malformation on `before` stays advertised-invalid.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["aa79f59478c6a912823d18136d2e116a60f43bcd"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7119] + }, + { + "sha": "81afb043f781676a15f0ce511c7784180e2224f7", + "subject": "fix(javascript): evaluate each short-circuit left operand once (#7126)", + "body": "fix(javascript): evaluate each short-circuit left operand once (#7126)\n\nLogical branch selection evaluated the left operand to decide which\nbranches stay reachable, and value evaluation then evaluated the selected\nleft branch again. In a left-nested `a || b || c ...` chain every level\nrepeated that, so semantic analysis doubled per operand and a 24-operand\nchain exhausted the per-source deadline.\n\nThe selection now carries the left operand's value with the branch, and\nvalue evaluation reuses it. Provenance still walks the branch nodes.\nResults are unchanged.\n\nFixes #7115\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["7336a566ace2f9d1412f78b0c56c2651b9b169cd"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7126] + }, + { + "sha": "e06be06530fc214e25f25f357a78d3619f75dd35", + "subject": "fix(cli): report JSON Lines selection refusals as caller errors (#7124)", + "body": "fix(cli): report JSON Lines selection refusals as caller errors (#7124)\n\n* fix(cli): report JSON Lines selection refusals as caller errors\n\nA --format jsonl refusal because the selected value is not a record\ncollection is the caller's output selection, not unreadable analysis\noutput. Report it as invalid_request/invalid_input that names the\nselection and its observed shape, keep the --format json /\n--filter-output remediation, and drop the rea doctor advice.\n\nAnalysisInputError gains an optional producer remediation, mirroring\nthe other refusal classes. The JSON Lines owner examines its documented\nboundaries once for both admission and refusal facts.\n\ndocs/cli.md now states that columnar results such as\ninspect-sqlite-database --table rows are not record collections.\n\nFixes #7110\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(cli): carry JSON Lines refusal facts as structured observations\n\nJSON Lines refusals now put the location and shape of each refused value\nin details.issues[].observed, and the message is built from those facts.\nTests assert the classification, issue path, observed facts, and the\nshared remediation constant instead of fixed sentences.\n\nThe filtered analysis-view export check now uses a non-empty request\nand compares the emitted rows with the unfiltered export.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["81afb043f781676a15f0ce511c7784180e2224f7"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7124] + }, + { + "sha": "5a22ae6bc8bae6cadd25aa5a6635a3c219d17b82", + "subject": "fix(mcp)!: return a compact binary_session status by default (#7127)", + "body": "fix(mcp)!: return a compact binary_session status by default (#7127)\n\n* fix(mcp)!: return a compact binary_session status by default\n\nbinary_session {} with no target open returned about 66 KB, most of it\nprovider rejection diagnostics and candidate capability sets that the\nskill's recovery flow re-reads on every retry. 6.8.0 grew it by 21%\nbecause the shared regex capability limitation began repeating setting\nbounds and step-by-step recovery for every search operation of every\nprovider (#6099, #6267, #6301, #7049) and IDA gained that limitation for\nits two search operations (#4862).\n\nThe regex limitation now states the effective deadline and heap, their\nsources and where to change them; the deadline and heap errors keep the\nfull recovery. binary_session gains detail: summary (default) or\ncomplete. The summary keeps open state, target identity, the binding,\nroute capabilities, run, activity and health status, each candidate's\navailability and target-support status, code and reason, and every\ntool's availability, reason, remediation and modes, and lists the\nfields it leaves out in omitted_fields. Complete detail returns the\nprevious shape. The CLI capabilities and providers commands keep\ncomplete provider facts through the same application projection.\n\nBREAKING CHANGE: binary_session {} no longer returns\nanalysis_provider_candidates[].availability.diagnostics,\ntarget_support.diagnostics or capabilities, or tool_availability group\nsurface, effects and annotations. Pass {\"detail\": \"complete\"} to get\nthem.\n\nFixes #7109\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(mcp): key binary_session output fields by detail\n\nThe output schema accepted detail: \"complete\" with summary candidates or\ntool groups, and a summary without omitted_fields, so detail did not\ntell callers which fields existed. Each session kind is now crossed\nwith a detail-specific shape: a summary requires omitted_fields and\nsummary-only candidates and tool groups; complete requires diagnostics,\ncandidate capabilities and static tool flags and forbids omitted_fields.\nBoth the canonical schema and the SDK-validated advertised schema reject\nmismatched shapes.\n\nThe verifier helper accepts summary candidates only for a validated MCP\nsummary; CLI provider output still requires candidate capabilities.\nRegex limitation tests check values, sources and setting names instead\nof whole sentences.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["e06be06530fc214e25f25f357a78d3619f75dd35"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7127] + }, + { + "sha": "70b96b65d9a72296c7e427525e5c33da7bf3ec06", + "subject": "fix(javascript): stop recording replaced slot values as store receivers (#7128)", + "body": "fix(javascript): stop recording replaced slot values as store receivers (#7128)\n\nReference-store identity queries resolved the written target as a value,\nso once a step consumed the written key the walk continued into the value\nread from that slot and recorded it, and everything reachable from it, as\nan object the store mutates. Every value stored into one local object at\nunknown keys then received an entry for every such store, and each new\nstore re-queued every earlier one. Ambient-write indexing grew cubically\nin the number of such stores.\n\nReceiver queries now drop items whose projection no longer ends at the\nwritten key. Stored-value selection has one owner, which the resolver and\nthe store fixpoint share. The fixpoint re-queues a dependent only when a\nchanged entry can reach it with a selection that its receiver query keeps.\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["5a22ae6bc8bae6cadd25aa5a6635a3c219d17b82"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7128] + }, + { + "sha": "25f0f9934d226caa62fb89d68e7bacad74f4fe73", + "subject": "fix(javascript): close member-path cycles through self stores (#7131)", + "body": "fix(javascript): close member-path cycles through self stores (#7131)\n\nA write below a slot that stores a value read from the same slot, such\nas `s.c = s.c.p; s.c.i = 1` on a parameter, revisits the binding with\none more segment after the stored key on every turn. The cycle closure\nonly recognized segments added at the front of the path (`node =\nnode[key]`), so the work-list never terminated and exhausted the owned\nworker heap (CodeMirror 5 `mode/stylus/stylus.js`).\n\nRecognize a contiguous segment inserted after a stable base, check that\nrepeating it after that base can never be pruned, and escape through it\nonce, as the self-alias rule already does. Front insertions keep their\nexisting order and result.\n\nFixes #7130\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["70b96b65d9a72296c7e427525e5c33da7bf3ec06"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7131] + }, + { + "sha": "f69c52a1cf3940ed1999fcc0859a75dbb913d684", + "subject": "feat(native): page retained load-image observations (#7134)", + "body": "feat(native): page retained load-image observations (#7134)\n\nAdd optional native load-image summary delivery and retained selected-row pages through shared CLI/MCP analysis views. Preserve source verification, provenance, unavailable collections, exact row identity and opt-in byte/check payloads.\n\nPreserve direct caller paths during shared CLI summary publication and cover raw/DOL projection contracts through the actual SDK. Real Ghidra ELF CLI/MCP captures, retained and file-backed pages, focused regressions and static checks passed; the PR records existing main schema failures and the JavaScript resource-recovery CI uncertainty.", + "parents": ["25f0f9934d226caa62fb89d68e7bacad74f4fe73"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7134] + }, + { + "sha": "6381aa0b1dcb7092673db5ac739af57ce220ed37", + "subject": "fix(ghidra): scope rejected-input diagnostics to their request (#7140)", + "body": "fix(ghidra): scope rejected-input diagnostics to their request (#7140)\n\nScope expected Ghidra input failures to the active request after the authenticated startup handshake. Preserve operation output, identity and log coordinates while retaining cumulative output with its session owner; lifecycle and unexpected failures keep full diagnostics.\n\nShare remote input-code classification with domain error projection. Verify startup rejection, healthy continuation, cleanup, unknown errors, OOM diagnostics and real CLI/MCP workflows. The measured unknown-symbol reply falls from 13,170 to 2,209 bytes with unchanged successful facts and Evidence IDs.", + "parents": ["f69c52a1cf3940ed1999fcc0859a75dbb913d684"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7140] + }, + { + "sha": "5d428390996498bc4dcca4da934641557f9109bc", + "subject": "revert(mcp): undo input schema fitting that broke main CI", + "body": "revert(mcp): undo input schema fitting that broke main CI\n\nThis reverts commit 7336a566ace2f9d1412f78b0c56c2651b9b169cd (#7119).\n\nAfter #7120 and the other merges of 2026-10-25 grew inspect_analysis_view's\ncomplete input schema (71,762 bytes plus 3,003 bytes of examples), the 64 KiB\nfitting from #7119 could no longer keep instance level 3 and fell back to\nlevel 2. That summarized the inline Evidence source and the view selector\ncollections, so main CI failed in toolInputReferences, toolSchemaValidity,\nanalysisViewMcp, absoluteLocalPathSchema, javascriptFactsViewMcp and\ngodotPckMcp. #7119's own CI ran against bc143125e, before that growth.\n\nReverting restores the complete full-profile advertisement while the size\nlimit is redesigned against these contracts (#4081 stays open).\n\nCo-Authored-By: Claude Opus 5.5 \nRefs: #7135\n", + "parents": ["6381aa0b1dcb7092673db5ac739af57ce220ed37"], + "authors": [ + { + "name": "Kaoru0822", + "email": "208281322+kaoru0822-kitauji@users.noreply.github.com", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "447907f2808877d3a7de62c382e256f55d08e5ac", + "subject": "docs(environments): explain building RL environments with REA", + "body": "docs(environments): explain building RL environments with REA\n", + "parents": ["5d428390996498bc4dcca4da934641557f9109bc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4c8647a706694665c881e5d8e3d50bfe70239db7", + "subject": "feat(native): page retained observations and source context (#7146)", + "body": "feat(native): page retained observations and source context (#7146)\n\n* feat(native): page retained observations and source context\n\n* docs(native): record complete observation workflow measurements\n\n* fix(native): preserve context coverage and overflow recovery\n\n* fix(benchmarks): finalize partially initialized observation probes\n\n* docs(native): publish reviewed workflow verification", + "parents": ["447907f2808877d3a7de62c382e256f55d08e5ac"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7146] + }, + { + "sha": "14631f698da79b71e9512752529615d6388e87c9", + "subject": "docs(website): showcase RL environment workflows", + "body": "docs(website): showcase RL environment workflows\n", + "parents": ["4c8647a706694665c881e5d8e3d50bfe70239db7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a0ddb83e453aab10163dea75f514d3cc7a1c95d5", + "subject": "docs(environments): lead with agent prompts", + "body": "docs(environments): lead with agent prompts\n", + "parents": ["14631f698da79b71e9512752529615d6388e87c9"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ff6d96bce8c54dc8f0e2184bfcb397d99506dae2", + "subject": "fix(website): surface RL environments and adjust homepage navigation", + "body": "fix(website): surface RL environments and adjust homepage navigation\n", + "parents": ["a0ddb83e453aab10163dea75f514d3cc7a1c95d5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a174892e3e52b58e74df5b9f53ba4d0e0617177c", + "subject": "fix(website): improve layout and clarify homepage copy", + "body": "fix(website): improve layout and clarify homepage copy\n", + "parents": ["ff6d96bce8c54dc8f0e2184bfcb397d99506dae2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b8ce3c74cd42a74893f890697ef9cb26c21a91a8", + "subject": "feat(native): make function matching allowance configurable (#7159)", + "body": "feat(native): make function matching allowance configurable (#7159)\n\nAllow native matching representation budgets to be selected at runtime or launch while retaining the 96 MiB default and main shared-provenance accounting. Preserve actionable configuration recovery through the setting owner and verify complete CLI/MCP matches for 20k/50k synthetic inventories and real stripped LLVM 14/15 inventories.\n\nFixes #6406.\n\nBased on #7112 by Kaoru0822; original authorship and co-author credit retained.\n\nCo-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["a174892e3e52b58e74df5b9f53ba4d0e0617177c"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "Kaoru0822", + "email": "208281322+kaoru0822-kitauji@users.noreply.github.com", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7159] + }, + { + "sha": "d69a54d592e5fed1319f202bfe2991d0a7323d22", + "subject": "fix(setup): register explicit MCP runtimes and preserve launcher identity", + "body": "fix(setup): register explicit MCP runtimes and preserve launcher identity\n", + "parents": ["b8ce3c74cd42a74893f890697ef9cb26c21a91a8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "14dd18a7fdf3526a543ff0de7cea6d59bb73dae4", + "subject": "fix(setup): preserve native configuration path traversal", + "body": "fix(setup): preserve native configuration path traversal\n", + "parents": ["d69a54d592e5fed1319f202bfe2991d0a7323d22"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "82fe820060bfd3fac705b5840ebe660146252f22", + "subject": "fix(setup): retain explicitly selected ILSpy paths", + "body": "fix(setup): retain explicitly selected ILSpy paths\n", + "parents": ["14dd18a7fdf3526a543ff0de7cea6d59bb73dae4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "37a7c2d6522171b2b0e8a52d56459749684ee713", + "subject": "fix(doctor): retain host uncertainty and resolved Java selection", + "body": "fix(doctor): retain host uncertainty and resolved Java selection\n", + "parents": ["82fe820060bfd3fac705b5840ebe660146252f22"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "db4d3abcda9be7c03cdc4cc97aa8f98b9cb49726", + "subject": "fix(setup): retain bounded startup diagnostics without losing failures", + "body": "fix(setup): retain bounded startup diagnostics without losing failures\n", + "parents": ["37a7c2d6522171b2b0e8a52d56459749684ee713"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1173c0a9dc1b352a60943a491462294db8f353ae", + "subject": "test(setup): align launch fixtures with runtime and host requirements", + "body": "test(setup): align launch fixtures with runtime and host requirements\n", + "parents": ["db4d3abcda9be7c03cdc4cc97aa8f98b9cb49726"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "60daca427d7713479ea4c82c4775ee57b95065aa", + "subject": "refactor(reconstruction): share canonical original cases across evaluation", + "body": "refactor(reconstruction): share canonical original cases across evaluation\n", + "parents": ["1173c0a9dc1b352a60943a491462294db8f353ae"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7ccecbcb0048ac760a6fba4d519497bddfcf193f", + "subject": "refactor(cdp): centralize execution context identity parsing", + "body": "refactor(cdp): centralize execution context identity parsing\n", + "parents": ["60daca427d7713479ea4c82c4775ee57b95065aa"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "991a2406060ae200ee5db260e486e68c1f5bb4bd", + "subject": "fix(cli): preserve script export evidence through shared finalization", + "body": "fix(cli): preserve script export evidence through shared finalization\n", + "parents": ["7ccecbcb0048ac760a6fba4d519497bddfcf193f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "941838fdd986babaac22a60b9c2c6c9f6ae329c3", + "subject": "refactor(elf): centralize fixed header type and flags decoding", + "body": "refactor(elf): centralize fixed header type and flags decoding\n", + "parents": ["991a2406060ae200ee5db260e486e68c1f5bb4bd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "634e566c0925f0afed5cef47cc426eb811ad51c5", + "subject": "refactor(capabilities): remove inert client requirement facade", + "body": "refactor(capabilities): remove inert client requirement facade\n", + "parents": ["941838fdd986babaac22a60b9c2c6c9f6ae329c3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "071a637a9fd571a7a18e728edbf6929874ecd8ed", + "subject": "refactor(cli): share managed comparison finalization", + "body": "refactor(cli): share managed comparison finalization\n", + "parents": ["634e566c0925f0afed5cef47cc426eb811ad51c5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7439d0d5d8b21274638a55387e99de4b35795fb8", + "subject": "refactor(artifacts): reuse Mach-O framing for Node SEA discovery", + "body": "refactor(artifacts): reuse Mach-O framing for Node SEA discovery\n", + "parents": ["071a637a9fd571a7a18e728edbf6929874ecd8ed"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5e581fd3b12e78a2727c061185bb5c680eb36084", + "subject": "refactor(workflows): share source caveat grouping identity", + "body": "refactor(workflows): share source caveat grouping identity\n", + "parents": ["7439d0d5d8b21274638a55387e99de4b35795fb8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f6d9f1b05c57c8685637cd9c4acabed2b2883084", + "subject": "refactor(browser): reuse worker URL exclusion classification", + "body": "refactor(browser): reuse worker URL exclusion classification\n", + "parents": ["5e581fd3b12e78a2727c061185bb5c680eb36084"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6819cc5b8d0eced770f15b4eb8b3978eae6827cc", + "subject": "fix(setup): preserve explicit configuration independently of readiness", + "body": "fix(setup): preserve explicit configuration independently of readiness\n", + "parents": ["f6d9f1b05c57c8685637cd9c4acabed2b2883084"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "fa6112b29f66669787e720759b99a25fe8956be6", + "subject": "fix(providers): preserve native traversal in installation paths", + "body": "fix(providers): preserve native traversal in installation paths\n", + "parents": ["6819cc5b8d0eced770f15b4eb8b3978eae6827cc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "52976ac5cdc08c76ca48ae0800b61024e4ae1af8", + "subject": "fix(doctor): bound and cancel diagnostic subprocesses", + "body": "fix(doctor): bound and cancel diagnostic subprocesses\n", + "parents": ["fa6112b29f66669787e720759b99a25fe8956be6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "72fa15a509fcdd4779ad58f19d0c03d06b350747", + "subject": "refactor(snapshots): derive workflow entries from canonical schema", + "body": "refactor(snapshots): derive workflow entries from canonical schema\n", + "parents": ["52976ac5cdc08c76ca48ae0800b61024e4ae1af8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5c4a6c467cf8766071383e57de19edca005506a6", + "subject": "refactor(pe): share optional header image and alignment facts", + "body": "refactor(pe): share optional header image and alignment facts\n", + "parents": ["72fa15a509fcdd4779ad58f19d0c03d06b350747"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "fab78501c77e09473d265003e3e94bc4309dbfd7", + "subject": "refactor(services): centralize direct provider input admission", + "body": "refactor(services): centralize direct provider input admission\n", + "parents": ["5c4a6c467cf8766071383e57de19edca005506a6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6362ac6b72d04247f8a9ae8677f22d6e23dd9e29", + "subject": "refactor(web): reuse shared provider input admission", + "body": "refactor(web): reuse shared provider input admission\n", + "parents": ["fab78501c77e09473d265003e3e94bc4309dbfd7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9fa5a87c73d2b3d70a3c0cd332986166b259bc12", + "subject": "refactor(javascript): remove obsolete Electron classifier facade", + "body": "refactor(javascript): remove obsolete Electron classifier facade\n", + "parents": ["6362ac6b72d04247f8a9ae8677f22d6e23dd9e29"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ba7ac7908db2c2a8e05b75df032cb175ab069669", + "subject": "refactor(elf): carry parsed header facts into native consumers", + "body": "refactor(elf): carry parsed header facts into native consumers\n", + "parents": ["9fa5a87c73d2b3d70a3c0cd332986166b259bc12"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "38ebe11a525c387350f4a6eb795e580ee2f60034", + "subject": "refactor(pe): centralize section header interpretation", + "body": "refactor(pe): centralize section header interpretation\n", + "parents": ["ba7ac7908db2c2a8e05b75df032cb175ab069669"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5a332d856a34e2d98db6a737086324062b0c53e7", + "subject": "refactor(browser): resolve Link metadata identity once", + "body": "refactor(browser): resolve Link metadata identity once\n", + "parents": ["38ebe11a525c387350f4a6eb795e580ee2f60034"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1fe1f1f8d61f3c02fe5cafc9413fdec6201ffe11", + "subject": "refactor(managed): retire redundant verification facade", + "body": "refactor(managed): retire redundant verification facade\n", + "parents": ["5a332d856a34e2d98db6a737086324062b0c53e7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "83a6cdb8596fdb2334862d512ca1b1be991fa4a6", + "subject": "fix(paths): preserve native traversal and unset PATH semantics", + "body": "fix(paths): preserve native traversal and unset PATH semantics\n", + "parents": ["1fe1f1f8d61f3c02fe5cafc9413fdec6201ffe11"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c11fb48c98a2d5db58cc9f3ab68c5beca2968835", + "subject": "fix(electron): share wrapped member identity parsing", + "body": "fix(electron): share wrapped member identity parsing\n", + "parents": ["83a6cdb8596fdb2334862d512ca1b1be991fa4a6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ed7b3a2a1006239466805cddff2d54c05503b890", + "subject": "refactor(macho): share header declarations across native readers", + "body": "refactor(macho): share header declarations across native readers\n", + "parents": ["c11fb48c98a2d5db58cc9f3ab68c5beca2968835"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d7d9457661179d160e4c0a18bd5461901ef91d5a", + "subject": "refactor(gpu): reuse canonical ELF note layout", + "body": "refactor(gpu): reuse canonical ELF note layout\n", + "parents": ["ed7b3a2a1006239466805cddff2d54c05503b890"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8982f40d00c365ee2ac43e715bd032cf850d6469", + "subject": "refactor(godot): share PCK header facts across inspections", + "body": "refactor(godot): share PCK header facts across inspections\n", + "parents": ["d7d9457661179d160e4c0a18bd5461901ef91d5a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "06655af3061f75a0a295ed447ad96f592256f01b", + "subject": "refactor(evidence): centralize publication source collection", + "body": "refactor(evidence): centralize publication source collection\n", + "parents": ["8982f40d00c365ee2ac43e715bd032cf850d6469"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f4768eb5d3581dfa3fd5c089e55d87825482b59c", + "subject": "fix(wasm): reuse canonical subject identity admission", + "body": "fix(wasm): reuse canonical subject identity admission\n", + "parents": ["06655af3061f75a0a295ed447ad96f592256f01b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2be39ef47acfbb10d2dfb84cffb097575eeb9a73", + "subject": "refactor(model): let format parsers own tensor range validation", + "body": "refactor(model): let format parsers own tensor range validation\n", + "parents": ["f4768eb5d3581dfa3fd5c089e55d87825482b59c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d3946a3f509e908397cf0274ac10a13ce2b90dd9", + "subject": "fix(apk): reuse canonical subject identity in retained views", + "body": "fix(apk): reuse canonical subject identity in retained views\n", + "parents": ["2be39ef47acfbb10d2dfb84cffb097575eeb9a73"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "42f3ed7119256da95bb9e569c8cb0c34edf8d853", + "subject": "refactor(tooling): move verifier host helpers out of runtime", + "body": "refactor(tooling): move verifier host helpers out of runtime\n", + "parents": ["d3946a3f509e908397cf0274ac10a13ce2b90dd9"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8fe3b17ea7cc3bf6a8cd58ec2dd5f002c74cb801", + "subject": "refactor(tooling): move completion ledger generation out of domain", + "body": "refactor(tooling): move completion ledger generation out of domain\n", + "parents": ["42f3ed7119256da95bb9e569c8cb0c34edf8d853"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "975900f56542fdff2bdafcd624038a261b0e9f21", + "subject": "docs(setup): state the FreeBuff minimum release (#7066)", + "body": "docs(setup): state the FreeBuff minimum release (#7066)", + "parents": ["2be39ef47acfbb10d2dfb84cffb097575eeb9a73"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7066] + }, + { + "sha": "a116d32cdc94293c368cdffa0ef26512db39ea69", + "subject": "chore: sync main before publishing cleanup migrations", + "body": "chore: sync main before publishing cleanup migrations\n", + "parents": [ + "8fe3b17ea7cc3bf6a8cd58ec2dd5f002c74cb801", + "975900f56542fdff2bdafcd624038a261b0e9f21" + ], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b654ac8b1339ed194a0672ee3469a2a5d04960a7", + "subject": "fix(setup): retain auxiliary tool selections in registrations", + "body": "fix(setup): retain auxiliary tool selections in registrations\n", + "parents": ["a116d32cdc94293c368cdffa0ef26512db39ea69"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "bf876efbaa48a0e6edb515c65b0682175cb9441d", + "subject": "fix(kuna): bind cached export reads to verified file state", + "body": "fix(kuna): bind cached export reads to verified file state\n", + "parents": ["b654ac8b1339ed194a0672ee3469a2a5d04960a7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7404847f641c5173a34e568b15ca7bcd6e22e8b6", + "subject": "fix(update): bound and own metadata probe lifetimes", + "body": "fix(update): bound and own metadata probe lifetimes\n", + "parents": ["bf876efbaa48a0e6edb515c65b0682175cb9441d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7cd65278ea941bcafaf5606600184c9f94f251a2", + "subject": "refactor(config): remove legacy provider timeout re-exports", + "body": "refactor(config): remove legacy provider timeout re-exports\n", + "parents": ["7404847f641c5173a34e568b15ca7bcd6e22e8b6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "85075fa9796fcb8c7231158744f4f2b0af2ff6b2", + "subject": "refactor(asar): let listing own parsed member facts", + "body": "refactor(asar): let listing own parsed member facts\n", + "parents": ["7cd65278ea941bcafaf5606600184c9f94f251a2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "23d56e1abd9748d0d6eac88c2796a921a02418b0", + "subject": "refactor(config): use canonical resource limit constants", + "body": "refactor(config): use canonical resource limit constants\n", + "parents": ["85075fa9796fcb8c7231158744f4f2b0af2ff6b2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9e4702b7a729fb2d25eb0469b6ac9d47ce7e7cde", + "subject": "fix(sqlite): preserve schema-owned input issue paths", + "body": "fix(sqlite): preserve schema-owned input issue paths\n", + "parents": ["23d56e1abd9748d0d6eac88c2796a921a02418b0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b3818bbba260125a6c618bacf2999854265e3010", + "subject": "refactor(il2cpp): share generic container byte decoding", + "body": "refactor(il2cpp): share generic container byte decoding\n", + "parents": ["9e4702b7a729fb2d25eb0469b6ac9d47ce7e7cde"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "90b793e0f488be73a3e98ba430bcb132ad8b0c31", + "subject": "docs: scope performance measurements to concrete needs", + "body": "docs: scope performance measurements to concrete needs\n", + "parents": ["b3818bbba260125a6c618bacf2999854265e3010"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d9e12c957b1d948527498e4f69de2c65b160f710", + "subject": "refactor(firmware): centralize extraction depth ceiling", + "body": "refactor(firmware): centralize extraction depth ceiling\n", + "parents": ["90b793e0f488be73a3e98ba430bcb132ad8b0c31"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "44b716f2f288ae3416e076d4aa5c2809533d1c7b", + "subject": "fix(runtime): preserve exact selected target identities", + "body": "fix(runtime): preserve exact selected target identities\n", + "parents": ["d9e12c957b1d948527498e4f69de2c65b160f710"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "943ae604df4da5e9d1f5ea7e43a2a510b6a4c828", + "subject": "refactor(reference): derive import lookup from reader inventory", + "body": "refactor(reference): derive import lookup from reader inventory\n", + "parents": ["44b716f2f288ae3416e076d4aa5c2809533d1c7b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "53779b59bf1bcef002cba1bd09f5056fc203c8f0", + "subject": "refactor(pe): reuse canonical section header facts", + "body": "refactor(pe): reuse canonical section header facts\n", + "parents": ["943ae604df4da5e9d1f5ea7e43a2a510b6a4c828"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f4987281fab32825501f6e7b1726c8e2fd2f25a8", + "subject": "fix(setup): forward supported tool and runtime selections", + "body": "fix(setup): forward supported tool and runtime selections\n", + "parents": ["53779b59bf1bcef002cba1bd09f5056fc203c8f0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0c147a4a7075b128c21c735df3d58a8a6d0a1a4f", + "subject": "fix(snapshot): preserve authenticated replay provenance", + "body": "fix(snapshot): preserve authenticated replay provenance\n", + "parents": ["f4987281fab32825501f6e7b1726c8e2fd2f25a8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2012efe5fd95ea3b1c9783b33ce33d6ba00fd412", + "subject": "fix(artifacts): retain source identity failures after relocation", + "body": "fix(artifacts): retain source identity failures after relocation\n", + "parents": ["0c147a4a7075b128c21c735df3d58a8a6d0a1a4f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "99d4ea9c051c378e6bf9ce1a3b1888b8ab54dce7", + "subject": "fix(captures): preserve relative redirect URL evidence", + "body": "fix(captures): preserve relative redirect URL evidence\n", + "parents": ["2012efe5fd95ea3b1c9783b33ce33d6ba00fd412"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b9ee8fe05774570380659fba81cddb6be0a29576", + "subject": "refactor(pe): centralize fixed COFF header decoding", + "body": "refactor(pe): centralize fixed COFF header decoding\n", + "parents": ["99d4ea9c051c378e6bf9ce1a3b1888b8ab54dce7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "971b48f702b16312ebaf73eeb433e4c9772e843e", + "subject": "refactor(mcp): reuse desktop retained-summary handler", + "body": "refactor(mcp): reuse desktop retained-summary handler\n", + "parents": ["b9ee8fe05774570380659fba81cddb6be0a29576"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "deed39f7c4bf7617e79bbf0bebabcd4e5c869664", + "subject": "refactor(pe): share optional-header facts across readers", + "body": "refactor(pe): share optional-header facts across readers\n", + "parents": ["971b48f702b16312ebaf73eeb433e4c9772e843e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "36515a5c9b4e145ebc52e2b9de692ea6b3fb6320", + "subject": "refactor(cli): derive desktop limits from the input contract", + "body": "refactor(cli): derive desktop limits from the input contract\n", + "parents": ["deed39f7c4bf7617e79bbf0bebabcd4e5c869664"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0929751798297d811d3e0441116d22140d88313e", + "subject": "refactor(macho): reuse canonical header declarations", + "body": "refactor(macho): reuse canonical header declarations\n", + "parents": ["36515a5c9b4e145ebc52e2b9de692ea6b3fb6320"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f4cc6c85efe7f3513d587df3bd5086adb1bc6a76", + "subject": "refactor(verification): share native client fixture assertions", + "body": "refactor(verification): share native client fixture assertions\n", + "parents": ["0929751798297d811d3e0441116d22140d88313e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "981d8069242f064bb41ace47f29bcbdd2dbcc508", + "subject": "refactor(macho): centralize segment and section decoding", + "body": "refactor(macho): centralize segment and section decoding\n", + "parents": ["f4cc6c85efe7f3513d587df3bd5086adb1bc6a76"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "554816becc41a91a2a2ee7bbe7c2b1d3abfe4296", + "subject": "refactor(verification): centralize native client result discovery", + "body": "refactor(verification): centralize native client result discovery\n", + "parents": ["981d8069242f064bb41ace47f29bcbdd2dbcc508"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "628087a2db9016b8f31b981a8642de5599e50ced", + "subject": "fix(process): preserve platform-aware environment precedence", + "body": "fix(process): preserve platform-aware environment precedence\n", + "parents": ["554816becc41a91a2a2ee7bbe7c2b1d3abfe4296"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c849a97d2af5bd8bcee3da1ed11e3eef3e3516d3", + "subject": "fix(setup): preserve explicit Codex home traversal", + "body": "fix(setup): preserve explicit Codex home traversal\n", + "parents": ["628087a2db9016b8f31b981a8642de5599e50ced"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f8c5a6cc10547e87bb7ad097d3a534a669a77d57", + "subject": "fix(providers): reject malformed UTF-8 before MCP decoding", + "body": "fix(providers): reject malformed UTF-8 before MCP decoding\n", + "parents": ["c849a97d2af5bd8bcee3da1ed11e3eef3e3516d3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0f64f1f85548de23600f1793f7ea8b4c63352297", + "subject": "refactor(macho): share bounded header declarations", + "body": "refactor(macho): share bounded header declarations\n", + "parents": ["f8c5a6cc10547e87bb7ad097d3a534a669a77d57"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "258a1dd3b7d867264655e5a69e6364921e3d0c79", + "subject": "fix(skills): parse metadata only from YAML frontmatter", + "body": "fix(skills): parse metadata only from YAML frontmatter\n", + "parents": ["0f64f1f85548de23600f1793f7ea8b4c63352297"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "38ed5a3142370a735a67c53672bfd65522e6899e", + "subject": "fix(browser): invalidate ASAR headers on file state changes", + "body": "fix(browser): invalidate ASAR headers on file state changes\n", + "parents": ["258a1dd3b7d867264655e5a69e6364921e3d0c79"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ce5373e42f119f47b5c91759fe00d7a79e96cde7", + "subject": "test(providers): verify malformed HTTP acquisition recovery", + "body": "test(providers): verify malformed HTTP acquisition recovery\n", + "parents": ["38ed5a3142370a735a67c53672bfd65522e6899e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1a1121c61f3aadfb8541bbbc143560ee6100d25e", + "subject": "fix(android): retain selected Java across workspace launches", + "body": "fix(android): retain selected Java across workspace launches\n", + "parents": ["ce5373e42f119f47b5c91759fe00d7a79e96cde7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c994870f6bd8b10efcc516afd1fb0481e5cc9399", + "subject": "fix(inspector): route file locations through URL semantics", + "body": "fix(inspector): route file locations through URL semantics\n", + "parents": ["1a1121c61f3aadfb8541bbbc143560ee6100d25e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a7d71f47ee2a6b687af28220acab05f3345fdccd", + "subject": "refactor(elf): centralize raw table declarations", + "body": "refactor(elf): centralize raw table declarations\n", + "parents": ["c994870f6bd8b10efcc516afd1fb0481e5cc9399"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "92bdb4443faa8d7dae128e3368b17e4ad2042acb", + "subject": "refactor(pe): share CodeView range interpretation", + "body": "refactor(pe): share CodeView range interpretation\n", + "parents": ["a7d71f47ee2a6b687af28220acab05f3345fdccd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "729684af9aacd93f4ad35e3378b371e05eb68def", + "subject": "refactor(png): share IHDR interpretation", + "body": "refactor(png): share IHDR interpretation\n", + "parents": ["92bdb4443faa8d7dae128e3368b17e4ad2042acb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3d565fa42a4a3d8bff65d3662cfb814bc9074734", + "subject": "refactor(windows): share native artifact validation", + "body": "refactor(windows): share native artifact validation\n", + "parents": ["729684af9aacd93f4ad35e3378b371e05eb68def"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "90199ff0ec83a7bce39e4b01fb8b3f771bf3bfc0", + "subject": "refactor(elf): centralize symbol record decoding", + "body": "refactor(elf): centralize symbol record decoding\n", + "parents": ["3d565fa42a4a3d8bff65d3662cfb814bc9074734"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "74f9870b7a49e5eadf13247c8b10fed5a352e85b", + "subject": "refactor(macho): share FAT evidence interpretation", + "body": "refactor(macho): share FAT evidence interpretation\n", + "parents": ["90199ff0ec83a7bce39e4b01fb8b3f771bf3bfc0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2411d60b5af1453033fb97ca5cc22da055e6d9b3", + "subject": "fix(verification): unify complete MCP catalog checks", + "body": "fix(verification): unify complete MCP catalog checks\n", + "parents": ["74f9870b7a49e5eadf13247c8b10fed5a352e85b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "91bacc5c14fe757d746fa66789e34da293d382b2", + "subject": "refactor(config): share bounded decimal setting validation", + "body": "refactor(config): share bounded decimal setting validation\n", + "parents": ["2411d60b5af1453033fb97ca5cc22da055e6d9b3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "28222089f499839716d91db2ebbac5c87b544adf", + "subject": "refactor(zip): share end-of-directory declarations", + "body": "refactor(zip): share end-of-directory declarations\n", + "parents": ["91bacc5c14fe757d746fa66789e34da293d382b2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "23bc51d5c48306ef91cc6f1766783bc89e18293d", + "subject": "test(package): migrate skill metadata fixture to frontmatter", + "body": "test(package): migrate skill metadata fixture to frontmatter\n", + "parents": ["28222089f499839716d91db2ebbac5c87b544adf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9341b116efddefc2bcdd8208d27d6e4ea78cc507", + "subject": "refactor: consolidate binary artifact interpretation and fixture ownership", + "body": "refactor: consolidate binary artifact interpretation and fixture ownership\n\nShare exact ELF program-header facts across nine consumers while preserving their admission and precision policies. Centralize conformance path and digest binding, retain verifier-specific checks, and route fixture-owner changes to CI qualification.\n", + "parents": ["23bc51d5c48306ef91cc6f1766783bc89e18293d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7adfcc4467b2871712a19f73431d8298b6dfa177", + "subject": "fix: unify executable format ownership across artifact readers", + "body": "fix: unify executable format ownership across artifact readers\n\nCentralize ELF section and Godot trailer declarations while preserving caller admission policies. Route six PE entrypoints through canonical DOS ownership so relocation data cannot establish a PE header, and update NativeAOT interpretation identity and verifier dependency coverage.\n", + "parents": ["9341b116efddefc2bcdd8208d27d6e4ea78cc507"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6336fe5bb5ca19754d76017458198d1140cd0476", + "subject": "refactor: consolidate binary analysis admission and format ownership", + "body": "refactor: consolidate binary analysis admission and format ownership\n\nReuse the existing provider input admission helper across twelve services,\npreserving cancellation, schema errors, path policies, and Evidence handling.\nShare ELF dynamic records across Dart, MIPS, and IL2CPP readers, and reuse\nMach-O segment and section records for Node SEA location.\n\nRequire canonical DOS ownership before GPU PE section discovery so relocation\nbytes cannot masquerade as a PE pointer. Cover valid short DOS headers and\nthe malformed case through both inventory and the public CLI.\n", + "parents": ["7adfcc4467b2871712a19f73431d8298b6dfa177"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "09acf217d946c7ca3659abe308896e010e9cc764", + "subject": "fix(evidence): preserve source and authenticated observation identity", + "body": "fix(evidence): preserve source and authenticated observation identity\n", + "parents": ["6336fe5bb5ca19754d76017458198d1140cd0476"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "86e7cd9b48171f1760abfa9a0952fff1d71666cf", + "subject": "fix(verification): keep runtime packaging and boundary fixtures complete", + "body": "fix(verification): keep runtime packaging and boundary fixtures complete\n", + "parents": ["09acf217d946c7ca3659abe308896e010e9cc764"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "eb51eb6915e16e88958058e56903bf6bc118240e", + "subject": "fix(process): preserve selected launch paths and completed command output", + "body": "fix(process): preserve selected launch paths and completed command output\n", + "parents": ["86e7cd9b48171f1760abfa9a0952fff1d71666cf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a7f50e338685781e7317a8d7659a79166736b269", + "subject": "refactor: consolidate ELF and CLR record interpretation", + "body": "refactor: consolidate ELF and CLR record interpretation\n\nShare ELF note headers across note inspection, Flutter build IDs, Node SEA,\nand recorded-crash source binding. Decode REL/RELA records once for MIPS\nshared-load analysis and IL2CPP linking, removing superseded scalar helpers.\n\nShare the CLR header prefix between desktop detection and managed PE parsing\nwhile preserving their distinct read bounds and admission policies. Cover\nthose differences and ignored R_NONE fields with production-boundary tests.\n\nValidation: 493 focused tests passed, two existing skips; static checks and\ntest discovery passed. Public managed/desktop CLI and ELF notes CLI/MCP\nworkflows exercised; no real external analysis providers were run.\n", + "parents": ["eb51eb6915e16e88958058e56903bf6bc118240e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8a657875079bc2644a1f6961447b730491e0d430", + "subject": "refactor: consolidate parsed image ownership across consumers", + "body": "refactor: consolidate parsed image ownership across consumers\n\nRetain validated DOS relocation records in their domain owner and consume\nthose facts in Ghidra load-image preparation. Preserve ordered duplicate\naliases, overlapping writes, and original/final byte evidence.\n\nShare FAT header facts across generic, native, and Hopper readers without\nmerging their distinct admission policies. Replace managed method bodies'\ntwo identical mapping lookups with one owned offset-and-extent result.\n\nValidation: 660 focused tests passed across 19 suites; typecheck, lint, and\ntest discovery passed. Hopper/Ghidra checks used fixtures and simulated\nprovider observations; no real external provider execution was performed.\n", + "parents": ["a7f50e338685781e7317a8d7659a79166736b269"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6c35d74a7dbb0ea384274f2a9e5d84b439961614", + "subject": "refactor: centralize input validation and schema interpretation", + "body": "refactor: centralize input validation and schema interpretation\n\nMigrate twelve application service files to the existing provider input owner,\npreserving schema causes, cancellation precedence, caller selection, and\nretained Evidence. Keep flows with distinct error policies separate.\n\nReplace the DeepSeek verifier's recursive object scan with schema-position\ntraversal using the canonical keyword and local-reference owners. Literal\npattern fields no longer cause false regex failures; patternProperties keys\nare checked alongside actual pattern constraints in native regex modes.\n\nValidation: 271 focused workflow/service tests and six verifier regressions\npassed; static checks, discovery, and actual Node source-loader smoke passed.\nThe baseline scanner reproduced the new regressions. Installed DeepSeek client\nexecution was not run.\n", + "parents": ["8a657875079bc2644a1f6961447b730491e0d430"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "18dc78fa43175b9628b45b731df06c9321c3f730", + "subject": "revert(mcp): undo input schema fitting that broke main CI (#7135)", + "body": "revert(mcp): undo input schema fitting that broke main CI (#7135)\n\nThis reverts commit 7336a566ace2f9d1412f78b0c56c2651b9b169cd (#7119).\n\nAfter #7120 and the other merges of 2026-10-25 grew inspect_analysis_view's\ncomplete input schema (71,762 bytes plus 3,003 bytes of examples), the 64 KiB\nfitting from #7119 could no longer keep instance level 3 and fell back to\nlevel 2. That summarized the inline Evidence source and the view selector\ncollections, so main CI failed in toolInputReferences, toolSchemaValidity,\nanalysisViewMcp, absoluteLocalPathSchema, javascriptFactsViewMcp and\ngodotPckMcp. #7119's own CI ran against bc143125e, before that growth.\n\nReverting restores the complete full-profile advertisement while the size\nlimit is redesigned against these contracts (#4081 stays open).\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["6c35d74a7dbb0ea384274f2a9e5d84b439961614"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7135] + }, + { + "sha": "86ff3237e1d87715fccbfbfcde75402517376a99", + "subject": "fix(paths): preserve selected command, output, and source identities", + "body": "fix(paths): preserve selected command, output, and source identities\n", + "parents": ["18dc78fa43175b9628b45b731df06c9321c3f730"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "eecadf35b20ac72d509513bef5949d36c887354d", + "subject": "fix(verification): unify client schema traversal and reference checks", + "body": "fix(verification): unify client schema traversal and reference checks\n\nShare ordered schema positions between Gemini literal checks, DeepSeek regex\nchecks, and catalog array-shape checks. Reuse the canonical keyword and local\nreference owners; keep unreferenced instance literals opaque and unresolved\nexternal or dynamic targets unknown.\n\nGemini and catalog checks now catch constraints in schemas reached through\nreferences into examples. Preserve source paths, resource scopes, cycles and\nregex occurrence counts. Align fixture first-error selection with the native\nGemini check and use consistent bracketed array locations in diagnostics.\n\nValidation: 55 focused tests passed, including full/compact MCP catalogs;\ntypecheck, lint, discovery, and Node source-loader checks passed. The old\nGemini scanner reproduced the local-reference false negative. Installed\nGemini and DeepSeek clients were not run.\n", + "parents": ["86ff3237e1d87715fccbfbfcde75402517376a99"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e2d4c0dabbcf1e9e0ee0249706eff906192e4188", + "subject": "fix(process): preserve environment snapshots and final cancellation", + "body": "fix(process): preserve environment snapshots and final cancellation\n", + "parents": ["eecadf35b20ac72d509513bef5949d36c887354d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7d36d172ab9b1718630a8e8646f87e7dfdbfc71a", + "subject": "fix(evidence): consolidate retained view and verifier ownership", + "body": "fix(evidence): consolidate retained view and verifier ownership\n", + "parents": ["e2d4c0dabbcf1e9e0ee0249706eff906192e4188"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ccdeda7a2779525e526f995be683ff91388e34f5", + "subject": "fix(inputs): centralize admission and preserve caller selections", + "body": "fix(inputs): centralize admission and preserve caller selections\n\nMove shared request parsing into its application owner, migrate all consumers, and remove six duplicated admission blocks while preserving cancellation and validation policy.\n\nKeep operator-selected JavaScript paths in verifier parent Evidence while retaining canonical comparison guards. Validated with 204 passing tests, 3 Linux-x64-only skips, typecheck, lint, and test discovery.\n", + "parents": ["7d36d172ab9b1718630a8e8646f87e7dfdbfc71a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3864c7d667593c3149ae81861540194a7bf81e99", + "subject": "fix(config): preserve captured environments across provider launches", + "body": "fix(config): preserve captured environments across provider launches\n", + "parents": ["ccdeda7a2779525e526f995be683ff91388e34f5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "721dd3d1aa271b99feaf56559af6d3ed24cc101a", + "subject": "fix(javascript): preserve selected inputs and completed source evidence", + "body": "fix(javascript): preserve selected inputs and completed source evidence\n", + "parents": ["3864c7d667593c3149ae81861540194a7bf81e99"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "da526fc014b408ddef5b3faff246c622aeffddca", + "subject": "fix(providers): preserve reply bytes and structured JSON ownership", + "body": "fix(providers): preserve reply bytes and structured JSON ownership\n\nShare strict UTF-8 JSON admission across bounded worker reports. Preserve IDA/JEB structured dictionaries through negotiated SDK validation and adapter decoding, retaining inherited tool validation and protocol handling.\n\nValidated 240 tests, including real SDK/HTTP exchanges and firmware file reads; 83 host-specific cases skipped. Typecheck, lint, and discovery passed. Real-provider execution and modern MCP protocol behavior remain unverified.\n", + "parents": ["721dd3d1aa271b99feaf56559af6d3ed24cc101a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f2b4468183e0c1fdc6dbf196283c580213cc7d73", + "subject": "fix(paths): preserve native selections across launch and publication", + "body": "fix(paths): preserve native selections across launch and publication\n", + "parents": ["da526fc014b408ddef5b3faff246c622aeffddca"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e596a48251a2fadd1bc173c1b3ba0ee2a4230a32", + "subject": "fix(sqlite): retain completed evidence through reply finalization", + "body": "fix(sqlite): retain completed evidence through reply finalization\n", + "parents": ["f2b4468183e0c1fdc6dbf196283c580213cc7d73"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9085222ca1b5a636d4835a48b8bfed03da461b4f", + "subject": "feat(mcp): support compact output schema advertisements (#7218)", + "body": "feat(mcp): support compact output schema advertisements (#7218)\n\nAdd opt-in bounded output-schema advertisements while preserving the full default, canonical server validation and complete structured content. Verify real stdio discovery under a 1 MiB receive cap, all 5,367 libcrypto export coordinates, complete Evidence parity, whole-task serialization estimates and resource bounds.\n\nFixes #2512. Integrates #7054 by Akshad Jogi with original authorship retained.\n\nCo-authored-by: Akshad Jogi ", + "parents": ["e596a48251a2fadd1bc173c1b3ba0ee2a4230a32"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "Akshad Jogi", + "email": "akshadjogi@gmail.com", + "user": { + "login": "akshad-exe", + "__typename": "User" + } + } + ], + "pullRequests": [7218] + }, + { + "sha": "4ca3032e7fe323bda8ad1a55af102ab99a5d39c1", + "subject": "fix(json): preserve configuration and capture data at admission", + "body": "fix(json): preserve configuration and capture data at admission\n", + "parents": ["9085222ca1b5a636d4835a48b8bfed03da461b4f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f8161ad7b31e636dd393e6b9cc1fe64a3de8a075", + "subject": "fix(setup): preserve selected home paths throughout skill installation", + "body": "fix(setup): preserve selected home paths throughout skill installation\n", + "parents": ["4ca3032e7fe323bda8ad1a55af102ab99a5d39c1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c06dc2d356f6bfb2f00aec33b295c41fe53f9e16", + "subject": "fix(native): retain completed debugger evidence through reply cleanup", + "body": "fix(native): retain completed debugger evidence through reply cleanup\n", + "parents": ["f8161ad7b31e636dd393e6b9cc1fe64a3de8a075"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e7f986c99485f48cb34d9e1d5cbf2f291a2d45ca", + "subject": "fix(json): consolidate dictionary admission across analysis and verification", + "body": "fix(json): consolidate dictionary admission across analysis and verification\n", + "parents": ["c06dc2d356f6bfb2f00aec33b295c41fe53f9e16"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "68f2d67c56f283a750371c65fcd536af71ad2313", + "subject": "fix(paths): preserve native selections through analysis and removal", + "body": "fix(paths): preserve native selections through analysis and removal\n", + "parents": ["e7f986c99485f48cb34d9e1d5cbf2f291a2d45ca"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "dec4cf50cb582988c4811ed8059e8c7e4ced3815", + "subject": "fix(captures): preserve reply failures through descriptor finalization", + "body": "fix(captures): preserve reply failures through descriptor finalization\n", + "parents": ["68f2d67c56f283a750371c65fcd536af71ad2313"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "cc5a96933aaae4738289c349c8720037c7b45590", + "subject": "test(mcp): validate selected tools without compiling the entire catalog", + "body": "test(mcp): validate selected tools without compiling the entire catalog\n", + "parents": ["dec4cf50cb582988c4811ed8059e8c7e4ced3815"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e54bf1006eadd0dfeea5c6c259cc3dc84bb414ec", + "subject": "fix(environment): own JSON fields across capture, state and replay", + "body": "fix(environment): own JSON fields across capture, state and replay\n", + "parents": ["cc5a96933aaae4738289c349c8720037c7b45590"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b675073b731dc3209f59578fad5ca8fe85b104cc", + "subject": "feat(mcp): scope advertised tools by family (#7228)", + "body": "feat(mcp): scope advertised tools by family (#7228)\n\nScope MCP discovery, setup, doctor, status and recovery guidance by selected tool families using one contract inventory and shared catalog identity. Preserve default discovery, canonical validation and complete Evidence.\n\nFixes #3246. Builds on #3026. Real libcrypto workflow verifies all 5,367 exports and identical complete Evidence. Static/source/build/docs/Windows/package/Greptile checks pass; ten assertions reproduced identically on clean main and feature across Node 24/22, with cancelled coverage explicitly unverified. Merge uses the user-authorized bypass for baseline failures and unchecked human-readiness declarations, without attesting human review.\n\nCo-authored-by: 0xLLVEL \nCo-authored-by: Codebuff \nCo-authored-by: Claude Opus 4.6 ", + "parents": ["e54bf1006eadd0dfeea5c6c259cc3dc84bb414ec"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "0xLLVEL", + "email": "fakhrezan1@gmail.com", + "user": { + "login": "0xLLVEL", + "__typename": "User" + } + }, + { + "name": "Codebuff", + "email": "noreply@codebuff.com", + "user": { + "login": "codebuff-team", + "__typename": "User" + } + }, + { + "name": "Claude Opus 4.6", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7228] + }, + { + "sha": "e3066c1705316b53b08f84814ae929eb6563e511", + "subject": "fix(deps): upgrade zod without narrowing timestamp inputs", + "body": "fix(deps): upgrade zod without narrowing timestamp inputs\n\nUpgrade Zod to 4.6.6 and refresh locked license inventories. Preserve REA's established timestamp spellings through one shared UTC/offset grammar, including completion-verifier consumers. Size the stdin resource regression from the child's actual heap capacity.\n\nFixes #7173\nIncludes the dependency and inventory changes proposed in #7184.\n\nCo-authored-by: tijo95 ", + "parents": ["b675073b731dc3209f59578fad5ca8fe85b104cc"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "tijo95", + "email": "georgesarmede@gmail.com", + "user": { + "login": "tijo95", + "__typename": "User" + } + } + ], + "pullRequests": [7230] + }, + { + "sha": "0211a07ec5c43b2f8cbdbcd80f3f3619773a7b72", + "subject": "fix(session): report a missing Linux ps as provider unavailability in status (#7180)", + "body": "fix(session): report a missing Linux ps as provider unavailability in status (#7180)\n\nKeep binary_session available when Linux owned-child probes lack procps ps. Preserve typed ownership-prerequisite failures in direct execution and report per-provider readiness in status. Independently validated on latest main through real stdio MCP plus focused regression, static and documentation checks. Closes #7164.", + "parents": ["e3066c1705316b53b08f84814ae929eb6563e511"], + "authors": [ + { + "name": "김준호", + "email": "101695482+chordpli@users.noreply.github.com", + "user": { + "login": "chordpli", + "__typename": "User" + } + } + ], + "pullRequests": [7180] + }, + { + "sha": "1a91630b88d339656124551e9578116656e65851", + "subject": "fix(setup): preserve Linux Hopper HTTP failure status (#7183)", + "body": "fix(setup): preserve Linux Hopper HTTP failure status (#7183)\n\nPreserve observed failed-response HTTP status through Linux Hopper setup diagnostics without changing download rejection, retry, or installation policy. Independently validated on latest main through red/green regressions, actual TLS sockets, focused checks and CI. Closes #7182.", + "parents": ["0211a07ec5c43b2f8cbdbcd80f3f3619773a7b72"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7183] + }, + { + "sha": "63417bf3f0857dbb07acaca5b0cf71046c9c0aa3", + "subject": "fix(contracts): publish portable browser request patterns (#7185)", + "body": "fix(contracts): publish portable browser request patterns (#7185)\n\nPublish portable browser request-path and HTTP-token patterns at their canonical owner, preserving input spelling and existing policy. Independently reproduced and verified through actual full-profile stdio MCP catalog and domain/MCP regressions on latest main. Closes #7168.", + "parents": ["1a91630b88d339656124551e9578116656e65851"], + "authors": [ + { + "name": "Nianze Wu", + "email": "wunianze666@gmail.com", + "user": { + "login": "wunianze666-netizen", + "__typename": "User" + } + } + ], + "pullRequests": [7185] + }, + { + "sha": "4557791a2e0b77ff08afbb886b9cd3a92b6e1aef", + "subject": "fix(contracts): advertise a v-mode portable Windows absolute-path pattern (#7152)", + "body": "fix(contracts): advertise a v-mode portable Windows absolute-path pattern (#7152)\n\nUse portable hex escapes for Windows absolute-path separators in the shared local path schema. Preserve host path semantics and caller spelling; validate Annex B/u/v compilation and Node win32 agreement. Closes #7151.", + "parents": ["63417bf3f0857dbb07acaca5b0cf71046c9c0aa3"], + "authors": [ + { + "name": "pablodiazjorge", + "email": "102741971+pablodiazjorge@users.noreply.github.com", + "user": { + "login": "pablodiazjorge", + "__typename": "User" + } + } + ], + "pullRequests": [7152] + }, + { + "sha": "cd68181c90792775ef4b3fd4910982084f79c285", + "subject": "fix(providers): preserve report bytes and dictionary facts", + "body": "fix(providers): preserve report bytes and dictionary facts\n", + "parents": ["4557791a2e0b77ff08afbb886b9cd3a92b6e1aef"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3b26d7f80b6bfa5d46c6a3817b949cb6924593f5", + "subject": "docs(security): add fallback reporting email", + "body": "docs(security): add fallback reporting email\n", + "parents": ["cd68181c90792775ef4b3fd4910982084f79c285"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "eb06e263cb7abfd020e586bf647905f645e2a59e", + "subject": "fix(plist): own dictionary decoding across Apple workflows", + "body": "fix(plist): own dictionary decoding across Apple workflows\n\nPreserve XML, OpenStep and binary dictionary keys at their format owners. Share validated binary reference facts with materialization while retaining scalar precision, UID identity and bounded expansion. Migrate archive, Interface Builder, native and app-bundle consumers, then remove obsolete key-omission accounting and schema copies.\n\nValidated source regressions and compiled CLI/MCP workflows, including native plist fidelity and archive identity. Typecheck, lint, docs and test discovery pass. No performance benchmarks were required.\n", + "parents": ["3b26d7f80b6bfa5d46c6a3817b949cb6924593f5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "77468d504330e2099474e460d8ddc242c4e81f26", + "subject": "fix(providers): preserve launch selections and refresh obsolete Kuna exports", + "body": "fix(providers): preserve launch selections and refresh obsolete Kuna exports\n", + "parents": ["eb06e263cb7abfd020e586bf647905f645e2a59e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4a8205456c8eb14199e9a50ddbdb2ab51f2453a8", + "subject": "fix(lifecycle): preserve source failures and native workspace diagnostics", + "body": "fix(lifecycle): preserve source failures and native workspace diagnostics\n", + "parents": ["77468d504330e2099474e460d8ddc242c4e81f26"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2b84efe0da5ced67ca814e73060a63e7444d17b2", + "subject": "fix(contracts): align CLI omission and native capability coverage", + "body": "fix(contracts): align CLI omission and native capability coverage\n", + "parents": ["4a8205456c8eb14199e9a50ddbdb2ab51f2453a8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "49816235f583b8e17eb4dc53310bf5cbc5eb307f", + "subject": "refactor(providers): consolidate IDA and JEB MCP result admission", + "body": "refactor(providers): consolidate IDA and JEB MCP result admission\n\nGive the object-structured provider envelope one owner that retains original dictionary members. Remove duplicate schemas, text extraction and JSON-or-text decoding plus the downstream casts that repaired lossy record clones. Keep provider-specific error, truncation, wrapper and payload-selection policies in each adapter.\n\nValidation: IDA/JEB compatibility tests, pinned SDK transport tests and provider regressions passed; check:fast passed. Real IDA/JEB applications were not exercised.\n", + "parents": ["2b84efe0da5ced67ca814e73060a63e7444d17b2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "19447516a4bdbc9437d112ebd3f12a5fd062db83", + "subject": "feat(ghidra): reuse existing projects through verified copies (#7236)", + "body": "feat(ghidra): reuse existing projects through verified copies (#7236)\n\nReuse selected Ghidra projects through verified private read-only copies, with shared CLI/MCP configuration, committed project identity, import-SHA verification and explicit historical/unknown analysis semantics. Preserve exact cancellation and platform capability boundaries.\n\nActual Ghidra 12.1.4/JDK21 Linux CLI/MCP investigations matched fresh import on 652-function ls and 14,338-function libcrypto inventories and pseudocode; authenticated complete Evidence, mismatch/staleness refusal, saved historical reports and shared /tmp projects verified. 958 focused tests passed with four platform skips; build/static/docs/format passed. Real macOS/Windows reuse remains unverified; Windows reuse is unavailable. See PR verification for measured whole-task costs and final CI attribution.\n\nCo-authored-by: akushonkamen \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["49816235f583b8e17eb4dc53310bf5cbc5eb307f"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "akushonkamen", + "email": "akushonkamen@163.com", + "user": { + "login": "akushonkamen", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7236] + }, + { + "sha": "5b983516ab5cb232d06488fcfe92d44d8092ee01", + "subject": "fix(hopper): consolidate release metadata and archive identity ownership", + "body": "fix(hopper): consolidate release metadata and archive identity ownership\n\nShare release JSON decoding, vendor fields and package integrity checks across macOS setup and Linux publishing/cache reads. Reject malformed UTF-8 instead of repairing macOS metadata, retain established initial BOM tolerance, and preserve complete vendor rows through admission and cache retention. Keep platform channel, signature, installation and cleanup policies unchanged.\n\nValidation: 134 focused tests passed with 21 platform skips; typecheck and lint passed. Linux-only signed-cache cases were updated but skipped on the macOS host. No live Hopper installation performed.\n", + "parents": ["19447516a4bdbc9437d112ebd3f12a5fd062db83"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "921142efbc31253043e6313cf8e8f2a5cde07320", + "subject": "fix(hopper): own profile reads and retain completed coordinate evidence", + "body": "fix(hopper): own profile reads and retain completed coordinate evidence\n", + "parents": ["5b983516ab5cb232d06488fcfe92d44d8092ee01"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f02df45a4693433c268081c30c5f1e66a5c13eea", + "subject": "fix(process): preserve selected Darwin helper environment through execution", + "body": "fix(process): preserve selected Darwin helper environment through execution\n", + "parents": ["921142efbc31253043e6313cf8e8f2a5cde07320"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0828917c795597651be201d61f94a85174bd02b6", + "subject": "refactor(verifiers): centralize named artifact output admission", + "body": "refactor(verifiers): centralize named artifact output admission\n\nRoute six artifact verifiers through the canonical complete MCP output and error parsers. Remove duplicated JSON/schema interpretation while retaining Evidence authentication, provider provenance, independent CLI parsing and CLI/MCP parity checks. Validate malformed success/error envelopes at the shared boundary.\n\nValidation: 11 boundary tests, Go compiler verifier (30 cases), and synthetic IL2CPP/Flutter verifier workflows passed; typecheck/lint passed. PCAP readiness passed with stub tools, but capture inspection is unsupported on macOS. Linux-only binary-layout and EVM verifier toolchains were unavailable.\n", + "parents": ["f02df45a4693433c268081c30c5f1e66a5c13eea"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "aa6c1d49fd8db201cb5619c90bee2899452dfed7", + "subject": "fix(mcp)!: require allowed hosts for non-loopback HTTP binds (#7172)", + "body": "fix(mcp)!: require allowed hosts for non-loopback HTTP binds (#7172)\n\nRequire operator-declared hostnames before serving MCP HTTP outside loopback, preserving Host/Origin gates. Parse hostname identities once, share typed startup recovery across CLI/MCP, and announce an admitted client URL. Generated AgentEnv bundles declare their client/service names and validate DNS/HTTP name identity before export.\n\nValidated through real packaged HTTP requests, direct SDK connection, compiled export refusals, 184 focused tests, static and documentation checks on the refreshed main integration. Final CI and review evidence is recorded in the PR body.\n\nBREAKING CHANGE: non-loopback deployments require MCP_ALLOWED_HOSTS or rea mcp --http --allowed-hosts; bundle names must be unchanged HTTP hostnames within the 63-octet DNS label bound.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["0828917c795597651be201d61f94a85174bd02b6"], + "authors": [ + { + "name": "Dery Ferdika", + "email": "114888155+DeryFerd@users.noreply.github.com", + "user": { + "login": "DeryFerd", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7172] + }, + { + "sha": "a30ffd27a60920dfe3cfec406ec386bfe0bc0358", + "subject": "refactor(dos): centralize MZ admission and load-image evidence", + "body": "refactor(dos): centralize MZ admission and load-image evidence\n", + "parents": ["aa6c1d49fd8db201cb5619c90bee2899452dfed7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b7e76a57cd29853e796b05a770cb14a0c435f35c", + "subject": "fix(adb): preserve selected environment through provider execution", + "body": "fix(adb): preserve selected environment through provider execution\n", + "parents": ["a30ffd27a60920dfe3cfec406ec386bfe0bc0358"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "fef76a02fbacf2eebb15122c87bbc37057f565b6", + "subject": "fix(apple): preserve own artifact metadata through schema projection", + "body": "fix(apple): preserve own artifact metadata through schema projection\n", + "parents": ["b7e76a57cd29853e796b05a770cb14a0c435f35c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "99062feaa7f48bacf1d53485b4869ecea4333555", + "subject": "test: bind MCP validation and cleanup faults to selected inputs", + "body": "test: bind MCP validation and cleanup faults to selected inputs\n", + "parents": ["fef76a02fbacf2eebb15122c87bbc37057f565b6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a84e0cfcfe0035094845946088d470c5bdd8cb3d", + "subject": "refactor(verifiers): consolidate capture result admission and parity", + "body": "refactor(verifiers): consolidate capture result admission and parity\n", + "parents": ["99062feaa7f48bacf1d53485b4869ecea4333555"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "625e32744ecf084a39c72daa042ca8abf90a15ba", + "subject": "fix(javascript): ignore async exec stdio options (#7087)", + "body": "fix(javascript): ignore async exec stdio options (#7087)\n\nRespect Node asynchronous exec/execFile method-default stdio instead of interpreting an ignored option. Remove the superseded callback-shape query while preserving caller input, Evidence, uncertainty, argv and fork controls. Independently validated on current main through actual Node pipe capture, matching real-app CLI/MCP facts, 81 targeted tests and static checking. Closes #7217.", + "parents": ["a84e0cfcfe0035094845946088d470c5bdd8cb3d"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7087] + }, + { + "sha": "a7aad91320213f136062668110bf5c1e63606d0d", + "subject": "fix(firmware): preserve report metadata before semantic validation", + "body": "fix(firmware): preserve report metadata before semantic validation\n", + "parents": ["625e32744ecf084a39c72daa042ca8abf90a15ba"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "65819e8cc56cdc07a7d27456084596b838c89fd7", + "subject": "fix(pcap): capture provider environment once", + "body": "fix(pcap): capture provider environment once\n", + "parents": ["a7aad91320213f136062668110bf5c1e63606d0d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b45a83368c11d02b9ed2acfeb04a19cac747b611", + "subject": "fix(ci): preserve lint diagnostics without source locations", + "body": "fix(ci): preserve lint diagnostics without source locations\n", + "parents": ["65819e8cc56cdc07a7d27456084596b838c89fd7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d9908fd7a42088992ddc74c75f3a3652e4839dcb", + "subject": "refactor(ghidra): consolidate function and inventory admission", + "body": "refactor(ghidra): consolidate function and inventory admission\n", + "parents": ["b45a83368c11d02b9ed2acfeb04a19cac747b611"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "81add3d23d66fc0cfc94e4eeccfde2f7b9630751", + "subject": "refactor(pyinstaller): centralize PYZ header and version facts", + "body": "refactor(pyinstaller): centralize PYZ header and version facts\n", + "parents": ["d9908fd7a42088992ddc74c75f3a3652e4839dcb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "cadd5b75b3605bdac72d4661bdf45f1803c39c67", + "subject": "refactor(elf): consolidate header and section-name interpretation", + "body": "refactor(elf): consolidate header and section-name interpretation\n", + "parents": ["81add3d23d66fc0cfc94e4eeccfde2f7b9630751"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a5ad1642831b386be04b97ab9de9fb8038f74d84", + "subject": "fix(browser): unify worker target admission across capture workflows", + "body": "fix(browser): unify worker target admission across capture workflows\n", + "parents": ["cadd5b75b3605bdac72d4661bdf45f1803c39c67"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4da7e46e9ce90d8a59dfc50dd7a9e400b657461a", + "subject": "fix(provider-selection): name whether a rejection came from availability or target support (#7220)", + "body": "fix(provider-selection): name whether a rejection came from availability or target support (#7220)\n\nDistinguish local provider readiness failures from target-support refusals in shared CLI/MCP diagnostics, preserving original codes and evidence. Avoid claiming configured providers are unconfigured.\n\n120 focused tests, static/docs checks and real ELF CLI/MCP verification pass. Hosted CI has the same four ADB failures as exact main d9908fd7a; three canceled shards remain unverified. Merge uses the user's explicit authorization to bypass proven main failures. Fresh Codex and Greptile reviews are clear.\n\nFixes #7214\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["a5ad1642831b386be04b97ab9de9fb8038f74d84"], + "authors": [ + { + "name": "YingNing", + "email": "59612604+dxqlovestudy@users.noreply.github.com", + "user": { + "login": "dxqlovestudy", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7220] + }, + { + "sha": "ab44487ff86d064e924fd2c44b02f5a5430f57f3", + "subject": "fix(adb): preserve process names and pin fixture interpreters", + "body": "fix(adb): preserve process names and pin fixture interpreters\n\nConsume Toybox’s single NAME separator without stripping source whitespace. Keep MCP subprocess fixtures independent of ambient PATH and validate calls through the existing named-schema helper.\n\nValidation: focused ADB provider/parser and MCP tests passed; no real Android device was used.\n", + "parents": ["4da7e46e9ce90d8a59dfc50dd7a9e400b657461a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d27e3f8e89c2a5b37bacb784e2275256441e6292", + "subject": "fix(native): preserve import names across dyld text formats", + "body": "fix(native): preserve import names across dyld text formats\n\nParse literal import framing and retain ambiguous boundaries. Consult undefined symbol-table names only when needed to distinguish producer spacing, with import and export captures owned separately.\n\nValidation: 59 native tests passed and real Apple tools on inert arm64 fixtures reproduced the old loss and verified the fix. Fresh build, typecheck and lint passed. Small warm-task median elapsed was unchanged; cold costs and agent tokens were not measured.\n", + "parents": ["ab44487ff86d064e924fd2c44b02f5a5430f57f3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "13fba271e6e14bf6235379564eb9d32aee7049d5", + "subject": "refactor(plist): centralize binary layout and offset ownership", + "body": "refactor(plist): centralize binary layout and offset ownership\n", + "parents": ["d27e3f8e89c2a5b37bacb784e2275256441e6292"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5508b2affd8bdd0788aed9d2246c373fd1b01bb7", + "subject": "fix(analysis): retain source evidence through directory exports (#7250)", + "body": "fix(analysis): retain source evidence through directory exports (#7250)\n\nRetain authenticated provider source records independently of snapshot replay eligibility and return them explicitly to plain application callers, including late cancellation. CLI/MCP commit source records before delivering links; function dossiers share the canonical Evidence constructor. Keep directory replies compact and preserve successful retry verification.\n\nReal Ghidra CLI/MCP investigations verify 652-function ls, historical report provenance, cross-session resume, unchanged source/project content and complete offline Evidence. Final full 14,338-function libcrypto comparison matches all metadata/pseudocode facts and independent fresh-import observations: 14,194 written, 143 external, one recorded deadline; 494.03 s, 445.63 CPU s, 1.584 GiB sampled family peak under 2-CPU/8-GiB guards, with no OOM or cleanup failure.\n\n144 focused tests and static/docs/site checks pass; latest-main integration passes 289 cases plus typecheck/lint and actual CLI snapshot source retrieval. Final CI source/static/build/docs/quality/package checks pass. Four ADB shard failures also occur in main CI 40349559391; cancelled coverage remains unverified and author declarations stay unchecked under the user's explicit bypass authorization. No human-review attestation is made.", + "parents": ["13fba271e6e14bf6235379564eb9d32aee7049d5"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7250] + }, + { + "sha": "8423c5c6d08512568c2a75753b6b7c3a9b6bbd4e", + "subject": "refactor(macho): consolidate prefix interpretation across readers", + "body": "refactor(macho): consolidate prefix interpretation across readers\n", + "parents": ["5508b2affd8bdd0788aed9d2246c373fd1b01bb7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2cdc8cb92ef3f800e32fe73ef80a334396461ceb", + "subject": "refactor(managed): centralize TypeDef row facts across consumers", + "body": "refactor(managed): centralize TypeDef row facts across consumers\n", + "parents": ["8423c5c6d08512568c2a75753b6b7c3a9b6bbd4e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1d32eb3aa4ac75ff8b240062a2036c9da5e5ccfa", + "subject": "fix(providers): keep operation environments consistent through launch", + "body": "fix(providers): keep operation environments consistent through launch\n\nCapture one environment snapshot per admitted WABT, JADX, firmware and Wakaru operation. Use it for tool selection, session identity and child launches while preserving configuration updates between operations.\n\nRegressions reproduce changed JVM options under an old session key, mixed engine/limiter selection and environment drift between subprocesses. Keep selected-wrapper and cleanup coverage in a shared fixture with separate scenarios.\n\nValidation: 115 distinct focused tests passed across the final five-file selection, including seven selected-command cases after refactoring. Fresh build, typecheck, lint and formatting passed. Tests use real subprocess fixtures; no real JADX/WABT/Binwalk/Wakaru engine or native Windows verification is claimed.\n", + "parents": ["2cdc8cb92ef3f800e32fe73ef80a334396461ceb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c2b0c955cd9935886dc24fdb02c031f955476457", + "subject": "fix(workers): reject malformed UTF-8 in JSON result files", + "body": "fix(workers): reject malformed UTF-8 in JSON result files\n", + "parents": ["1d32eb3aa4ac75ff8b240062a2036c9da5e5ccfa"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0973649cec47a6a65edf74cc587fd5801c5c7302", + "subject": "refactor(captures): consolidate recorded exchange body facts", + "body": "refactor(captures): consolidate recorded exchange body facts\n", + "parents": ["c2b0c955cd9935886dc24fdb02c031f955476457"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "60b55be7e7ef666ec071b6bf9099f55c6aa75b45", + "subject": "fix(native): bound PE export names before intermediate retention", + "body": "fix(native): bound PE export names before intermediate retention\n\nCharge PE alias names when storing them, before target interpretation can suppress output rows. Validate unused-slot names as bytes without retaining or decoding strings. Keep row and forwarder accounting separate so names are charged once.\n\nPreserve alias ordering, malformed unused-name issues and ordinal-only suppression. Add production service/provider retention regressions using compact shared-pointer fixtures.\n\nValidation: 43 focused parser, filesystem, CLI and stdio MCP tests; fresh build, typecheck, lint and formatting passed. Three bounded Node 24.22.1 measurement pairs showed median process RSS high-water 154000 to 93168 KiB; timing and sampled family memory have cache/startup/sampling limits. No Windows loader acceptance or OOM reproduction claim.\n", + "parents": ["0973649cec47a6a65edf74cc587fd5801c5c7302"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3d74c480e019621f804cd4d68101cffc5d367287", + "subject": "fix(verifiers): consolidate Ghidra MCP result admission", + "body": "fix(verifiers): consolidate Ghidra MCP result admission\n", + "parents": ["60b55be7e7ef666ec071b6bf9099f55c6aa75b45"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "74d5cab372150fe2d816980ef34ef315c5f9f1fa", + "subject": "fix(native): account export and version text in UTF-8 bytes", + "body": "fix(native): account export and version text in UTF-8 bytes\n\nCount retained UTF-8 text rather than UTF-16 code units, including exact-byte base64 spellings. Bound the decoded version-name map independently from output expansion, releasing replaced entries from its live storage charge.\n\nAdd real service/provider boundary controls for accepted and over-budget symbol names, version names and unused version metadata. Existing per-string bounds remain the allocation owner.\n\nValidation: native parser, filesystem and CLI/MCP views passed; build, typecheck, lint and formatting passed. No serialized-report size cap, OOM reproduction or performance improvement is claimed.\n", + "parents": ["3d74c480e019621f804cd4d68101cffc5d367287"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9d2c087d8306803c232286e6e3f05fd6acc7a8ad", + "subject": "fix(readers): preserve completed snapshots through cleanup retries", + "body": "fix(readers): preserve completed snapshots through cleanup retries\n\nRetain exact completed file path, digest and length in Python pyc and Erlang BEAM failure observations. Translate Python close failures at the provider boundary and bind them to the retained descriptor cleanup leases so later successful retries resolve prior errors.\n\nExercise actual services and file handles with completed reads, cancellation during finalization and physical read failure followed by cancellation. Assert no fabricated snapshot on early failure and resolution of every prior cleanup report.\n\nValidation: six focused descriptor regressions plus existing filesystem, parser and MCP coverage passed; build and static checks passed. Authored format fixtures establish portable reader behavior, not CPython/Erlang runtime execution.\n", + "parents": ["74d5cab372150fe2d816980ef34ef315c5f9f1fa"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f6805e29c3c74223660686b5ca979c0508e1b195", + "subject": "refactor(pe): centralize resource tree facts across readers", + "body": "refactor(pe): centralize resource tree facts across readers\n", + "parents": ["9d2c087d8306803c232286e6e3f05fd6acc7a8ad"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "662ec2e4501e975f2d1a28958a1ff560a9e24869", + "subject": "fix(verifiers): preserve source Evidence through shared admission", + "body": "fix(verifiers): preserve source Evidence through shared admission\n", + "parents": ["f6805e29c3c74223660686b5ca979c0508e1b195"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1ce9f317be4c5c9b8c8efb6e6260d4e4c933ab4d", + "subject": "refactor(pyinstaller): centralize PYZ member role ownership", + "body": "refactor(pyinstaller): centralize PYZ member role ownership\n", + "parents": ["662ec2e4501e975f2d1a28958a1ff560a9e24869"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "31e8492fafc91438bc0c6e5a5cc40c989a6fc5b8", + "subject": "refactor(artifacts): centralize completed snapshot observations", + "body": "refactor(artifacts): centralize completed snapshot observations\n\nNormalize completed stable-file path, digest and length in one shared observation owner. Migrate thirteen identical provider projections while preserving their selected paths, schema checks and cleanup composition.\n\nKeep specialized metadata and worker reply observations at their existing owners. Validation: shared real-descriptor coverage and provider lifecycle tests passed; build, typecheck, lint and formatting passed.\n", + "parents": ["1ce9f317be4c5c9b8c8efb6e6260d4e4c933ab4d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "939009f6f9ca178840f8ec5616c694c7e09dec25", + "subject": "fix(artifacts): preserve completed caller reads through finalization", + "body": "fix(artifacts): preserve completed caller reads through finalization\n\nRetain file identity after Rust, web artifact, shared selected-input and historical capture reads complete before close or cancellation fails. Preserve descriptor-set snapshots in diagnostics alongside sanitized capture observations.\n\nClassify canonical physical capture failures before cleanup composition; source permission errors and bare syscall failures keep their meaning through late cancellation and retry. Keep explicit sensitive-value redaction on retained facts.\n\nValidation: 247 focused cases passed, two Linux-only cases skipped; build, typecheck, lint and formatting passed. Real descriptors with controlled finalization faults establish reader ownership and facts. Worker reply and multi-file database completion semantics remain separate audit work.\n", + "parents": ["31e8492fafc91438bc0c6e5a5cc40c989a6fc5b8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c09fa01b379b5571e97d69b0ccde5fc214a73a43", + "subject": "refactor(managed): centralize MemberRef row facts", + "body": "refactor(managed): centralize MemberRef row facts\n", + "parents": ["939009f6f9ca178840f8ec5616c694c7e09dec25"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6d5532a204b338a6c770fcbae61e0d55bda70793", + "subject": "feat(web): page retained bundle endpoint observations and inferences (#7259)", + "body": "feat(web): page retained bundle endpoint observations and inferences (#7259)\n\nPage retained web-bundle endpoint observations and inferences through shared CLI/MCP projections, preserving source identities, scoped unknowns, coverage and complete Evidence access.\n\nBased on HarsH’s original implementation in #7213 (6b1d5d42). Real Chromium/CLI/SDK verification and whole-task cost limits are recorded in docs/verification/web-bundle-paging-2026-10-26.md.\n\nExplicit user authorization permits leaving human-readiness declarations unchecked and bypassing reproduced main failures (ADB listing fixture, package catalog expectation, untouched APK verifier formatting). No human-review attestation is made.\n\nCo-authored-by: HarsH ", + "parents": ["c09fa01b379b5571e97d69b0ccde5fc214a73a43"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "HarsH", + "email": "harshasalkar7@gmail.com", + "user": { + "login": "HarsH-1877", + "__typename": "User" + } + } + ], + "pullRequests": [7259] + }, + { + "sha": "e405d685bc320fbdf07c1e4a27010f2374f066e7", + "subject": "refactor(macho): centralize dylib command and string facts", + "body": "refactor(macho): centralize dylib command and string facts\n", + "parents": ["6d5532a204b338a6c770fcbae61e0d55bda70793"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "624ebb2a1e633ce14b6d6828eef50bf7d7db68ac", + "subject": "refactor(elf): consolidate bounded string-table interpretation", + "body": "refactor(elf): consolidate bounded string-table interpretation\n", + "parents": ["e405d685bc320fbdf07c1e4a27010f2374f066e7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3b4c910fff24baf83957a9bc529c170f457d944a", + "subject": "fix(browser): unify CDP frame and document identity facts", + "body": "fix(browser): unify CDP frame and document identity facts\n\nParse each frame event using its declared protocol fields and retain loader and ancestry only across same-document updates. This removes alias-based attribution, invalidates malformed committed frame facts, and prevents stale WebMCP tools surviving a same-URL document replacement.\n\nMigrate Electron, screenshot, capture, timeline, and execution consumers to the shared facts owner and retire the old helper exports. Validated 428 focused tests, test discovery, typecheck/lint, and real Chrome CLI/MCP network capture; Electron and WebMCP regressions use simulated CDP.\n", + "parents": ["624ebb2a1e633ce14b6d6828eef50bf7d7db68ac"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d77cf6186631743025a1bafb8c5a27262da6128e", + "subject": "fix(evm): retain admitted evidence through reply finalization", + "body": "fix(evm): retain admitted evidence through reply finalization\n", + "parents": ["3b4c910fff24baf83957a9bc529c170f457d944a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e813c4c344d2414d1b8dfe42a421792d91b01dcc", + "subject": "fix(pwntools): separate reply admission from debugger enrichment", + "body": "fix(pwntools): separate reply admission from debugger enrichment\n", + "parents": ["d77cf6186631743025a1bafb8c5a27262da6128e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "669e617eec5422ebce1ab271af0fc7b51e90dc11", + "subject": "fix(sqlite): preserve completed member facts on acquisition failure", + "body": "fix(sqlite): preserve completed member facts on acquisition failure\n", + "parents": ["e813c4c344d2414d1b8dfe42a421792d91b01dcc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d06ca092fb7e9624215c89c621417bf74dab8293", + "subject": "refactor(python): consolidate bytecode identity across readers", + "body": "refactor(python): consolidate bytecode identity across readers\n\nShare CPython magic framing, version and header facts while keeping standalone marshal coverage and PyInstaller reconstruction eligibility distinct. Preserve legacy headers, opaque unknowns and source bytes.\n\nValidated 272 focused tests across source, CLI and MCP workflows, a 38-test reader recheck, and check:fast.\n", + "parents": ["669e617eec5422ebce1ab271af0fc7b51e90dc11"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "620690c92324c28e6ff8f79bc4789b1c2897828a", + "subject": "refactor(firmware): unify extraction problem interpretation", + "body": "refactor(firmware): unify extraction problem interpretation\n\nDerive dependency and generic-error facts once per owning task, chunk or multifile stage. Reuse those facts for failure classification and dependency aggregation, preserving unnamed identities, severity precedence and raw diagnostics.\n\nValidation: 70 focused tests passed; 41 platform-guarded tests skipped on macOS. Typecheck and lint passed. Real Unblob/Linux provider behavior was not run.\n", + "parents": ["d06ca092fb7e9624215c89c621417bf74dab8293"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "82af5b5f52e58686184404c03f6691be776410df", + "subject": "fix(web): retain completed file identities across acquisition failures", + "body": "fix(web): retain completed file identities across acquisition failures\n", + "parents": ["620690c92324c28e6ff8f79bc4789b1c2897828a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "55f72b5d538a285b6d6784a5fe87fe113e496a2b", + "subject": "fix(workers): preserve failure receipts and their cleanup owners", + "body": "fix(workers): preserve failure receipts and their cleanup owners\n", + "parents": ["82af5b5f52e58686184404c03f6691be776410df"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ff568afa34921dd2132f546e5f7092b1d81f00c4", + "subject": "refactor(artifacts): retain Node SEA admission facts through inventory", + "body": "refactor(artifacts): retain Node SEA admission facts through inventory\n\nPass validated blob location and decoded metadata with their admitted descriptor from classification to the reader. Keep root cleanup ownership, freshness checks, format validation order and direct-reader decoding intact, then release borrowed facts after preparation.\n\nValidation: 147 focused source, CLI and MCP tests passed, including real Node blob production; check:fast passed. Optional injected-ELF Docker verification was unavailable because the Docker daemon is not running.\n", + "parents": ["55f72b5d538a285b6d6784a5fe87fe113e496a2b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8ced814b96bc78e936905c02ffabf9240f5ad146", + "subject": "fix(browser): unify script and context attribution facts", + "body": "fix(browser): unify script and context attribution facts\n\nCentralize CDP script/context declarations and frame-claim interpretation across web capture, Electron, V8, active runtime and storage seeding. Preserve each workflow's admission, provenance and retention policies while removing superseded helpers and schemas.\n\nMalformed or conflicting frame claims now leave passive scripts unattributed. Reused context IDs replace future frame authority without rebinding earlier scripts, and source readers reject empty script IDs.\n\nValidation: 153 focused tests and check:fast passed; 13 regression failures reproduced on the prior commit. Real Chrome script export and runtime CLI/MCP verifiers passed, including correctly reported uncertain cleanup after intentional target closure. Electron regression coverage used simulated CDP.\n", + "parents": ["ff568afa34921dd2132f546e5f7092b1d81f00c4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1f5c5c31c1d1017f7b895bdd8cc38247a50005f6", + "subject": "refactor(managed): centralize method implementation flag facts", + "body": "refactor(managed): centralize method implementation flag facts\n\nHave the MethodDef row owner derive code type, managed kind and the P/Invoke flag for both body decoding and native-boundary inventory. Remove duplicate masks and unreachable fallbacks while preserving raw flags, zero-RVA precedence and ImplMap-specific declaration policy.\n\nValidation: 280 focused source, CLI and MCP tests passed, including cross-workflow flag combinations and declaration/body policy boundaries. Typecheck and lint passed.\n", + "parents": ["8ced814b96bc78e936905c02ffabf9240f5ad146"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f6478c056f7bd4dcc8ab951352f165a6f4653c9c", + "subject": "fix(providers): keep each inspection on one environment snapshot", + "body": "fix(providers): keep each inspection on one environment snapshot\n", + "parents": ["1f5c5c31c1d1017f7b895bdd8cc38247a50005f6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b4b5c37ab3de1e0f8f4369dcad26fd6ceb18aa85", + "subject": "fix(web): retain admitted provenance through incomplete traces", + "body": "fix(web): retain admitted provenance through incomplete traces\n", + "parents": ["f6478c056f7bd4dcc8ab951352f165a6f4653c9c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "741f2de7517d97d26a7cd84cf1045532963eda84", + "subject": "test(ci): align source preservation and catalog assertions", + "body": "test(ci): align source preservation and catalog assertions\n", + "parents": ["b4b5c37ab3de1e0f8f4369dcad26fd6ceb18aa85"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "416f16e2ede8b31ec3bbb8d02efbf8c62074c8aa", + "subject": "fix(managed): unify metadata row and coded-index ownership", + "body": "fix(managed): unify metadata row and coded-index ownership\n\nShare Field scalar facts and use one coded-index tag registry for widths and decoding. Preserve reserved constructor tags, generic-instantiation restrictions, heap failure order and selected-field signature admission.\n\nDerive native import member kind from the validated MemberForwarded coordinate independently of name lookup, retaining known field or method identity when its display name is unreadable.\n\nValidation: 368 focused source, CLI and MCP tests passed; five lost-kind regressions reproduced on the previous commit. Heap-width, coded-width, reserved-tag and selection boundaries are covered. Typecheck and lint passed.\n", + "parents": ["741f2de7517d97d26a7cd84cf1045532963eda84"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "afc79add7e6e88419b723782a22fddb568064368", + "subject": "fix(providers): bind signal and capture configuration per operation", + "body": "fix(providers): bind signal and capture configuration per operation\n", + "parents": ["416f16e2ede8b31ec3bbb8d02efbf8c62074c8aa"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "df6db781ddae6a85a370591b3c4f17e140029d87", + "subject": "refactor(pyinstaller): centralize CArchive member roles", + "body": "refactor(pyinstaller): centralize CArchive member roles\n\nDerive member roles at the table-of-contents boundary and share declaration and Python-module interpretations across validation, projection, metadata, header reconstruction and nested PYZ traversal. Retain source type codes and generic-file behavior for other printable types.\n\nValidation: 217 focused archive, CLI and MCP tests passed, including mixed-role byte and metadata checks. Typecheck and lint passed.\n", + "parents": ["afc79add7e6e88419b723782a22fddb568064368"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "99ff4344c0702afad782cd26178d50b18fa6ee4b", + "subject": "fix(browser): centralize CDP network event facts", + "body": "fix(browser): centralize CDP network event facts\n\nParse shared request and response fields at the CDP boundary while preserving capture, session and runtime admission policies. Treat empty request IDs as unknown so unrelated events cannot be joined, and retain redirect occurrences and partial response evidence.\n\nValidate 221 focused tests, fast checks, and real Chrome network and runtime verifiers.\n", + "parents": ["df6db781ddae6a85a370591b3c4f17e140029d87"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "bab49aaf7c1ffb791bc8ca423bffb42f6b0d5560", + "subject": "refactor(artifacts): unify stable read failure ownership", + "body": "refactor(artifacts): unify stable read failure ownership\n\nCentralize completed file observations and cleanup error projection across stable-file providers while preserving each provider’s failure classification and exact cleanup leases. Cover BEAM finalization cancellation and devicetree cleanup retries.\n\nValidated 223 focused lifecycle and MCP tests and check:fast.\n", + "parents": ["99ff4344c0702afad782cd26178d50b18fa6ee4b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7a237aa72144a7ee2198c7a0193b767d2285b989", + "subject": "refactor(views): share immutable result readers", + "body": "refactor(views): share immutable result readers\n\nUse the common analysis-view reader for Rust and native inventory validation, preserving historical defaults and original Evidence while retaining schema-specific validation.\n\nValidated 123 focused view and service tests and check:fast.\n", + "parents": ["bab49aaf7c1ffb791bc8ca423bffb42f6b0d5560"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "347494f3ab0eae57e50bf6f7d94cf0e65db65e1f", + "subject": "fix(captures): preserve cleanup ownership and sensitive evidence", + "body": "fix(captures): preserve cleanup ownership and sensitive evidence\n", + "parents": ["7a237aa72144a7ee2198c7a0193b767d2285b989"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "64f053ab6356bf92567f32ba9d227500a00ee036", + "subject": "chore: remove unused internal exports", + "body": "chore: remove unused internal exports\n", + "parents": ["347494f3ab0eae57e50bf6f7d94cf0e65db65e1f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d54f5b07b4adc82d9d2be479c19966667f429e02", + "subject": "fix(artifacts): complete positional reads across short results", + "body": "fix(artifacts): complete positional reads across short results\n\nContinue reading Mach-O and Electron ranges after positive short descriptor reads, while preserving explicit EOF, cancellation, file identity and cleanup semantics. Advance fuse scanning and hashing by the bytes actually read.\n\nValidated focused filesystem, Mach-O, dyld, Electron and MCP workflows: 117 tests passed, two Windows-only tests skipped; check:fast passed.\n", + "parents": ["64f053ab6356bf92567f32ba9d227500a00ee036"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d4c511ae6e5cb7a43ef140e75070d99e20c8b8f6", + "subject": "fix(javascript): honor effective symbolic descriptor values (#7222)", + "body": "fix(javascript): honor effective symbolic descriptor values (#7222)\n\nResolve ordered descriptor values at the shared JavaScript fact owner and preserve uncertain intrinsic writes instead of stale exports. Normalize ordinary method values and reuse canonical primitive, prototype, ambient identity and ordering facts across consumers.\n\n384 selected tests, format/static/docs checks, all final CI jobs and reviews pass. Actual Node controls cover 35 bundles; one possibly repeated factory explicitly stays unknown. Shipped Obsidian selected-source complete Evidence matches base/fixed CLI and MCP, with coverage and resource measurements in the PR.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["d54f5b07b4adc82d9d2be479c19966667f429e02"], + "authors": [ + { + "name": "SII-YDD", + "email": "38822679+SII-YDD@users.noreply.github.com", + "user": { + "login": "SII-YDD", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7222] + }, + { + "sha": "5da50ab3f43c7f5498ef8ee84c38289158bcbfe7", + "subject": "fix(artifacts): retain reader work through cleanup", + "body": "fix(artifacts): retain reader work through cleanup\n", + "parents": ["d4c511ae6e5cb7a43ef140e75070d99e20c8b8f6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f68064e46c2ed71ca55a35f639a11893595b1eb5", + "subject": "fix(evidence): exclude sensitive publication identities", + "body": "fix(evidence): exclude sensitive publication identities\n", + "parents": ["5da50ab3f43c7f5498ef8ee84c38289158bcbfe7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a7004c7df1298724e8fbbeb42a4d36c1e0ec5025", + "subject": "fix(filesystem): finish executable and project span reads", + "body": "fix(filesystem): finish executable and project span reads\n\nReuse the positional range owner for target metadata, Hopper Mach-O selection and Kuna spans. Preserve physical failures, completed span evidence and cleanup ownership across cancellation and short reads.\n\nValidated 147 focused file and lifecycle tests; ten new cases reproduced failures against the prior implementation.\n", + "parents": ["f68064e46c2ed71ca55a35f639a11893595b1eb5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "615fbbbdd750de2df5d92b9827d0c7c4422c1d03", + "subject": "refactor(mcp): consolidate evidence tool execution", + "body": "refactor(mcp): consolidate evidence tool execution\n\nShare provider availability, admission, logging and Evidence delivery across browser, Electron and runtime tools. Reuse retained summary delivery for Python and BEAM selected views while preserving preflight and complete parent Evidence.\n\nValidated 47 focused MCP and retained-view acceptance tests and check:fast.\n", + "parents": ["a7004c7df1298724e8fbbeb42a4d36c1e0ec5025"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3ca1cc546607d18df2d9fa5ce9bcc31cc0ed0ef7", + "subject": "fix(filesystem): complete plist and limits probes", + "body": "fix(filesystem): complete plist and limits probes\n\nRead bounded plist format probes and Linux resource-limit reports through positive short reads before classifying their contents. Preserve explicit EOF, report capacity, physical failures and descriptor cleanup ownership.\n\nValidated 66 focused tests and check:fast; nine new fault-injected cases fail against the previous implementation. Linux procfs was not verified on a real Linux host.\n", + "parents": ["615fbbbdd750de2df5d92b9827d0c7c4422c1d03"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ca75643dbce5b7ece34633075cbdc9261e06ddca", + "subject": "fix(setup): preserve registration choices and own prewarm", + "body": "fix(setup): preserve registration choices and own prewarm\n", + "parents": ["3ca1cc546607d18df2d9fa5ce9bcc31cc0ed0ef7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f1535a17531a5b05f33b210e7acd7037dd5a25ea", + "subject": "fix(artifacts): retain archive streams and source receipts", + "body": "fix(artifacts): retain archive streams and source receipts\n", + "parents": ["ca75643dbce5b7ece34633075cbdc9261e06ddca"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3a65ef0e4c9f0894076eb3412b0ee171a839091c", + "subject": "fix(browser): redact scenario cleanup diagnostics", + "body": "fix(browser): redact scenario cleanup diagnostics\n", + "parents": ["f1535a17531a5b05f33b210e7acd7037dd5a25ea"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1008d5e30290d9f056f262d2aff0f042ba3897ab", + "subject": "fix(asar): retain unsupported integrity declarations", + "body": "fix(asar): retain unsupported integrity declarations\n\nCarry reported algorithms and hashes into listing limitations when the declaration cannot be compared, retaining the existing verification and extraction policies. Bound escaped text before allocation.\n\nValidated ASAR inventory, extraction, cleanup and MCP workflows; prior code omits the declaration details.\n", + "parents": ["3a65ef0e4c9f0894076eb3412b0ee171a839091c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4bbd87953fa0ac78ca22e4321cce458558319205", + "subject": "fix(environment): align recorded probe chronology", + "body": "fix(environment): align recorded probe chronology\n\nUse the shared recorded timestamp interpretation for replay ordering, including exact fractions and UTC interpretation of supported zone-less forms. Preserve native-Date fallback for unsupported historical spellings.\n\nValidated environment comparison, state ordering and CLI tests; five new cases reproduce prior drift.\n", + "parents": ["1008d5e30290d9f056f262d2aff0f042ba3897ab"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4e86bd0c1c519704409b04926ad588875d4fc08c", + "subject": "fix(asar): disclose unverified block integrity", + "body": "fix(asar): disclose unverified block integrity\n\nRetain a limitation when ASAR block integrity fields are present. Whole-file hash verification does not establish block verification or Electron runtime acceptance.\n\nValidated inventory and extraction workflows, including partial and malformed block declarations.\n", + "parents": ["4bbd87953fa0ac78ca22e4321cce458558319205"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "dd7a2da5bb0c2e91d300dbaebd3a7aca8379a965", + "subject": "fix(environment): keep invalid recorded dates unknown", + "body": "fix(environment): keep invalid recorded dates unknown\n\nDistinguish invalid supported timestamp spellings from unrecognized legacy formats at the recorded-date owner. Probe replay retains ordinal order for invalid dates without changing the existing legacy fallback.\n\nValidated date parsing, state ordering and comparison workflows; the prior implementation reorders the invalid-date regression.\n", + "parents": ["4e86bd0c1c519704409b04926ad588875d4fc08c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0d1a454e25db825567782e461da21530bad4b158", + "subject": "fix(ghidra): admit newer 12.x releases as compatible builds (#6924)", + "body": "fix(ghidra): admit newer 12.x releases as compatible builds (#6924)\n\nAdmit same-major Ghidra releases at or above the verified minor through the existing compatible/unverified policy. Preserve the observed version, verified12.1.4 pin, installation-declared Java floor and separate NativeAOT verification gate.\n\n367 targeted tests/static/docs, all10 real Java bridge-source compilation, and actual Linux12.2/JDK25 CLI/MCP queries and cleanup pass. JDK21 remains refused for12.2. Exact-main controls reproduce all3 unrelated CI assertions; canceled shards and an apt-blocked binary-layout lane remain unverified.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["dd7a2da5bb0c2e91d300dbaebd3a7aca8379a965"], + "authors": [ + { + "name": "Saim Shafique", + "email": "msaimshafique4664@gmail.com", + "user": { + "login": "sx4im", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [6924] + }, + { + "sha": "9e6dd8e372aaf69fd64b449e84b64311b75166d9", + "subject": "docs(desktop): name the get_evidence_bundle tool in the MCP section (#7266)", + "body": "docs(desktop): name the get_evidence_bundle tool in the MCP section (#7266)\n\nThe collection-paging paragraph says complete Evidence stays accessible through\n`get_evidence`, but no tool by that name exists. The session family registers\n`get_evidence_bundle`, which is the only name the catalog, the contracts and the\nCLI equivalents use.\n\nEvery other page already uses the full name, so this was the only place a reader\nor agent would look for a tool that cannot be called.", + "parents": ["0d1a454e25db825567782e461da21530bad4b158"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [7266] + }, + { + "sha": "47679701051dc207533bde5e516e5a77583d52c5", + "subject": "fix(artifacts): explain recovery for existing DMG attachments (#7221)", + "body": "fix(artifacts): explain recovery for existing DMG attachments (#7221)\n\nPreserve producer-supported recovery guidance after an existing-image DMG attachment refusal, without borrowing or detaching existing mounts. Keep diagnostics, root provenance and unknown coverage; centralize guidance ownership and run the real mounted-image regression in macOS CI.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["9e6dd8e372aaf69fd64b449e84b64311b75166d9"], + "authors": [ + { + "name": "Chip Li", + "email": "53254273+hichipli@users.noreply.github.com", + "user": { + "login": "hichipli", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7221] + }, + { + "sha": "d815367a110d5293db3275c3dabf337f23af2063", + "subject": "fix(analysis): preserve failure and cleanup outcomes", + "body": "fix(analysis): preserve failure and cleanup outcomes\n", + "parents": ["47679701051dc207533bde5e516e5a77583d52c5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "855eb703af2a7cf8935b6be38b234cc58e7ea73a", + "subject": "perf(setup): wait directly for prewarm completion", + "body": "perf(setup): wait directly for prewarm completion\n", + "parents": ["d815367a110d5293db3275c3dabf337f23af2063"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3233992733c33dabf2de09d22ee4e6d9409f797a", + "subject": "fix(browser): redact startup cleanup diagnostics", + "body": "fix(browser): redact startup cleanup diagnostics\n", + "parents": ["855eb703af2a7cf8935b6be38b234cc58e7ea73a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "19b2972dfb9716fc03e3378304081f95718bb421", + "subject": "fix(environment): separate request order from completion", + "body": "fix(environment): separate request order from completion\n\nRetain valid request starts independently of duration and require observed completion for interval-based state and write inferences. Bound indexed interference checks across captured writes while preserving ordinal fallback and unmodified Evidence.\n\nValidated state, comparison, CLI and MCP workflows with known, unknown, overlapping and redacted timing controls; check:fast passed.\n", + "parents": ["3233992733c33dabf2de09d22ee4e6d9409f797a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "63220edcc3b47d44e72a7d77518172d81961e67a", + "subject": "fix(environment)!: withhold clock writes without an anchor", + "body": "fix(environment)!: withhold clock writes without an anchor\n\nKeep missing or ambiguous scenario request durations unknown, retain learned clock rules, and withhold plans that cannot generate an observed clock. Refuse such writes in older imported states before changing state or generators.\n\nBREAKING CHANGE: The write-plan reason can now be unknown-clock; strict clients must accept the new output value.\n\nValidated state, CLI and advertised MCP workflows, documentation, and focused clock and cleanup regressions.\n", + "parents": ["19b2972dfb9716fc03e3378304081f95718bb421"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "906f161dc6c17413a8af588cad9bb9db3c55a78a", + "subject": "fix(environment): share legacy recorded-time interpretation", + "body": "fix(environment): share legacy recorded-time interpretation\n\nUse one owner for exact recorded timestamps and documented native-Date fallback in state and probe replay. Retain the source and disclose native precision and host-timezone dependence in state limitations.\n\nValidated historical chronology, timezone and unknown-duration regressions against prior behavior.\n", + "parents": ["63220edcc3b47d44e72a7d77518172d81961e67a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8b7ee48a46ba4176f4bf19225dc6c80efb020335", + "subject": "fix(kuna): bind cache exports to their producing inputs", + "body": "fix(kuna): bind cache exports to their producing inputs\n", + "parents": ["906f161dc6c17413a8af588cad9bb9db3c55a78a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ca3fd7baf927060da8ae91994071e8e4b07ec08d", + "subject": "fix(javascript): preserve artifact failures through cleanup", + "body": "fix(javascript): preserve artifact failures through cleanup\n", + "parents": ["8b7ee48a46ba4176f4bf19225dc6c80efb020335"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "06c8e14b347dd64bd4c2485baf6f80e890ce4344", + "subject": "fix(native): retain lipo field declarations", + "body": "fix(native): retain lipo field declarations\n\nDistinguish omitted slice fields from declarations that cannot be interpreted, and preserve their source in native results and artifact limitations. Keep structural fallback and capacity failures explicit.\n", + "parents": ["ca3fd7baf927060da8ae91994071e8e4b07ec08d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "47fa4fbad6d801d57c16aeed942bf5164245a7a1", + "subject": "fix(views): bind Mach-O rows to selected facets", + "body": "fix(views): bind Mach-O rows to selected facets\n\nDerive each facet's row schema from the Mach-O producer and validate it against the requested page. Preserve the existing wire shape and historical defaults.\n", + "parents": ["06c8e14b347dd64bd4c2485baf6f80e890ce4344"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4803c4f9c2cae46dfc1e4fa28448393a5d65d89a", + "subject": "fix(setup): preserve selected settings and Java paths", + "body": "fix(setup): preserve selected settings and Java paths\n", + "parents": ["47fa4fbad6d801d57c16aeed942bf5164245a7a1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b6e58c22d41effdb43dceb2624e9d9697d095b77", + "subject": "fix(evidence): retain source and stream ownership", + "body": "fix(evidence): retain source and stream ownership\n", + "parents": ["4803c4f9c2cae46dfc1e4fa28448393a5d65d89a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5f916167271ae065fc16711be1a2f5a310ed79a7", + "subject": "fix(hopper): confirm private display probe cleanup", + "body": "fix(hopper): confirm private display probe cleanup\n", + "parents": ["b6e58c22d41effdb43dceb2624e9d9697d095b77"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "41919740105f659c5cd29be8465aea549478c22c", + "subject": "fix(environment): share retained response declarations", + "body": "fix(environment): share retained response declarations\n\nPreserve status independently of malformed content and use one declaration reader for route grouping, state extraction and manifest eligibility. Verify the partial facts through CLI and MCP views.\n", + "parents": ["5f916167271ae065fc16711be1a2f5a310ed79a7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "52414282b95b560f1c11a2f694ac03fceceeebe5", + "subject": "fix(xrefs): trust provider address validation", + "body": "fix(xrefs): trust provider address validation\n\nAfter an invalid address-format result, resolve the caller's exact symbol instead of reclassifying address-like names with a separate heuristic.\n", + "parents": ["41919740105f659c5cd29be8465aea549478c22c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "19f9011511db53fc9b0b8c518a6483baa89bb694", + "subject": "fix(setup): honor VS Code user data overrides", + "body": "fix(setup): honor VS Code user data overrides\n", + "parents": ["52414282b95b560f1c11a2f694ac03fceceeebe5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3a6e4f2cb148b123ebba7c05f5aa5b75bfe71b30", + "subject": "fix(managed): report graph method page coverage", + "body": "fix(managed): report graph method page coverage\n", + "parents": ["19f9011511db53fc9b0b8c518a6483baa89bb694"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e1ec737d9b21413ce9c5b94af732628678432ba3", + "subject": "refactor(artifacts): share extraction admission and reader construction", + "body": "refactor(artifacts): share extraction admission and reader construction\n\nReuse completed embedded-format observations only after validating the admitted file identity and state, and centralize reader construction across inventory and extraction. Preserve early refusal, selected-path checks, ZIP ownership, and each operation's traversal policy. A source changed between preflight and inventory now fails integrity validation.\n", + "parents": ["3a6e4f2cb148b123ebba7c05f5aa5b75bfe71b30"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "81adb8977a2df1b84b628aed9317719e6df91fd8", + "subject": "fix(ghidra): honor current directory in PATH discovery", + "body": "fix(ghidra): honor current directory in PATH discovery\n", + "parents": ["e1ec737d9b21413ce9c5b94af732628678432ba3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "67b91810107c42d50922aef68bca83ae32b61abb", + "subject": "fix(ida): separate function identity from source span", + "body": "fix(ida): separate function identity from source span\n\nNormalize function address and name without requiring an unused upstream size. Preserve complete upstream observations and the explicit unknown body coverage across IDA protocol profiles.\n", + "parents": ["81adb8977a2df1b84b628aed9317719e6df91fd8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8694dc30d94ac1a431c37e1f7377451588763f98", + "subject": "fix(hopper): discover linked application bundles", + "body": "fix(hopper): discover linked application bundles\n", + "parents": ["67b91810107c42d50922aef68bca83ae32b61abb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "83b2d16ee9e11f5e9ec21acde1bb03ddb7c23409", + "subject": "fix(javascript): distinguish HTML script loads from data", + "body": "fix(javascript): distinguish HTML script loads from data\n", + "parents": ["8694dc30d94ac1a431c37e1f7377451588763f98"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "60834e391c3f81eb2343eba288b735c3bf3bde61", + "subject": "fix(artifacts)!: compare ASAR storage declarations", + "body": "fix(artifacts)!: compare ASAR storage declarations\n\nRecord packed and unpacked ASAR file declarations at the reader boundary and compare known storage changes without treating historical omissions as packed. Preserve known differences when bytes are unavailable and retain existing integrity precedence.\n\nBREAKING CHANGE: ASAR file occurrences may now contain unpacked: false. Consumers that validate only true must accept an optional boolean; absent historical fields remain unknown.\n", + "parents": ["83b2d16ee9e11f5e9ec21acde1bb03ddb7c23409"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e89192653402222c5b099216f0d83a2d1bceace0", + "subject": "fix(artifacts): compare Node SEA member declarations", + "body": "fix(artifacts): compare Node SEA member declarations\n\nCompare each retained member's exact runtime key and role without treating archive order as semantic identity. Keep one-sided legacy declaration gaps unknown, preserve proven changes with unavailable content, and retain original Evidence.\n", + "parents": ["60834e391c3f81eb2343eba288b735c3bf3bde61"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "779d548c4e553f01cb1aaf61d6949885c6f02806", + "subject": "fix(artifacts): preserve selected ASAR companion paths", + "body": "fix(artifacts): preserve selected ASAR companion paths\n", + "parents": ["e89192653402222c5b099216f0d83a2d1bceace0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c6893d1ac6a9ccb8a11d64b4e9ba1b57e79cbfd8", + "subject": "fix(browser): preserve external defaults during CDP attachment (#7188)", + "body": "fix(browser): preserve external defaults during CDP attachment (#7188)\n\nAttach to external browsers without implicit default-context overrides, and own temporary focus only on the selected page. Preserve unrelated page media and exact page inventory through CLI/MCP. Remove bootstrap-page retries; retain late/failed cleanup ownership and verified SDK notices.\n\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["779d548c4e553f01cb1aaf61d6949885c6f02806"], + "authors": [ + { + "name": "akushonkamen", + "email": "74654766+akushonkamen@users.noreply.github.com", + "user": { + "login": "akushonkamen", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7188] + }, + { + "sha": "7f6561706428f4d4d1acb7cdb5c5e1a683645a84", + "subject": "fix(artifacts): resolve historical retained summaries", + "body": "fix(artifacts): resolve historical retained summaries\n\nAuthenticate exact retained parents against current and documented historical summary projections, including caller-selected display paths. Keep source facts, Evidence commitments and unsupported-projection rejection intact.\n", + "parents": ["c6893d1ac6a9ccb8a11d64b4e9ba1b57e79cbfd8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c4cdb7658b0eb5ef16b30bd8127479bce8c21233", + "subject": "fix(jeb)!: preserve engine refusal diagnostics", + "body": "fix(jeb)!: preserve engine refusal diagnostics\n\nParse JEB failure envelopes at the provider boundary and retain the original response, recovery facts, and selected inputs. Do not infer an unsupported target from undocumented error codes; preserve completed primary observations when metadata requests fail.\n\nBREAKING CHANGE: JEB engine refusals now report execution_failure rather than unsupported_target. Consumers should inspect the retained upstream diagnostics for the engine's reason and recovery facts.\n", + "parents": ["7f6561706428f4d4d1acb7cdb5c5e1a683645a84"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3515b262218f2d4ba94ce6a7bda9766747b3d84d", + "subject": "refactor(ownership)!: remove redundant aliases", + "body": "refactor(ownership)!: remove redundant aliases\n\nUse canonical owners for literal matches, tool families, MCP schema presentation and IDA protocol selection; remove unused web-bundle reexports. Remove the duplicate CLI command name and keep the canonical compare workflow.\n\nBREAKING CHANGE: rea compare-bundles has been removed. Use rea compare instead. The MCP compare_bundles tool is unchanged.\n", + "parents": ["c4cdb7658b0eb5ef16b30bd8127479bce8c21233"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c27560e434980615ecbc66fca518398f45002360", + "subject": "fix(artifacts): classify selected package names", + "body": "fix(artifacts): classify selected package names\n", + "parents": ["3515b262218f2d4ba94ce6a7bda9766747b3d84d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7c8eb63fccecb9d8e46c652b7745067a4ad87ea7", + "subject": "fix(javascript): retain package entrypoint provenance", + "body": "fix(javascript): retain package entrypoint provenance\n", + "parents": ["c27560e434980615ecbc66fca518398f45002360"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "567ea4b1e8bb7dda67563d06f1b4977c2d92995a", + "subject": "refactor(ownership)!: consolidate legacy aliases", + "body": "refactor(ownership)!: consolidate legacy aliases\n\nMigrate schema, installer, ASN.1, and tooling consumers to their owning definitions. Remove the redundant CI task entry and the deprecated Cutter command-local JSON flag.\n\nBREAKING CHANGE: Replace Cutter --json=true or --json=false with --json-output=true or --json-output=false. Bare --json still controls CLI result formatting.\n", + "parents": ["7c8eb63fccecb9d8e46c652b7745067a4ad87ea7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "50717c39b6b7c78aee8378aa5704b376395f35c2", + "subject": "refactor(contracts): consolidate provider and search ownership", + "body": "refactor(contracts): consolidate provider and search ownership\n\nResolve IDA compatibility facts in one place and migrate capability, session, and verifier consumers. Move native search fields to the domain and reuse residual unknown fields for filters.\n", + "parents": ["567ea4b1e8bb7dda67563d06f1b4977c2d92995a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ed6668b5bcb6ac2137700c53224046ccfdae2934", + "subject": "fix(evidence): validate process captures before bundle export", + "body": "fix(evidence): validate process captures before bundle export\n\nReuse the read-side capture validation before publication so exported bundles can be imported. Preserve historical and foreign record identity and existing destination files on failure.\n", + "parents": ["50717c39b6b7c78aee8378aa5704b376395f35c2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d60b2cab65c3c9119b25ede4d2b99928ff815fbf", + "subject": "docs(ida): document migration from legacy attached registrations", + "body": "docs(ida): document migration from legacy attached registrations\n\nDescribe the native plugin setup, identity and capability differences, verification, and rollback. Link the migration from the packaged skill source.\n", + "parents": ["ed6668b5bcb6ac2137700c53224046ccfdae2934"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "90475ec9e59bc1f10fc5c927cf44a3ad8a86eac0", + "subject": "fix(artifacts): retain selected keyed archive paths", + "body": "fix(artifacts): retain selected keyed archive paths\n", + "parents": ["d60b2cab65c3c9119b25ede4d2b99928ff815fbf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d0e695b42a16b29acf65c14ea1822a56cd32c3c1", + "subject": "fix(hopper): bind relative launcher paths once", + "body": "fix(hopper): bind relative launcher paths once\n", + "parents": ["90475ec9e59bc1f10fc5c927cf44a3ad8a86eac0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a6488a96a967d4e2ef75a896c65172ee72240c83", + "subject": "fix(javascript): preserve renderer path anchors", + "body": "fix(javascript): preserve renderer path anchors\n", + "parents": ["d0e695b42a16b29acf65c14ea1822a56cd32c3c1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "82fd2236385138dd71cf0a49be3b417acfc58292", + "subject": "refactor(native): consolidate provider-neutral analysis contracts", + "body": "refactor(native): consolidate provider-neutral analysis contracts\n\nMove shared function, dossier, inventory, reference and output semantics from the legacy Hopper module to native domain owners. Migrate provider, adapter, test and verifier consumers directly.\n", + "parents": ["a6488a96a967d4e2ef75a896c65172ee72240c83"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "030fa886f94e894e34ed2539e9d8dedff19c3327", + "subject": "fix(setup): verify published configuration content during uninstall", + "body": "fix(setup): verify published configuration content during uninstall\n\nRequire publication readback in the owning check so in-place edits are detected and preserved with the original backup.\n", + "parents": ["82fd2236385138dd71cf0a49be3b417acfc58292"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "248133d784522488b01296391a0eea3eabbd7567", + "subject": "fix(analysis): interpret provider and ELF inputs once", + "body": "fix(analysis): interpret provider and ELF inputs once\n\nPass parsed MIPS program declarations to shared-load analysis and validate IDA string address selectors before enumeration, including empty inventories.\n", + "parents": ["030fa886f94e894e34ed2539e9d8dedff19c3327"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b529bd84d727fcd5d1bd91fa4428a29a96ac780e", + "subject": "refactor(contracts): preserve named output schema types", + "body": "refactor(contracts): preserve named output schema types\n\nKeep exact readonly schema maps and constrain contract factories to their owned keys. Verify named catalog lookups retain each schema type.\n", + "parents": ["248133d784522488b01296391a0eea3eabbd7567"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "fc7f042c8cae607a4d18016788c05dc4711413dd", + "subject": "refactor(lifecycle): require cleanup for offline providers", + "body": "refactor(lifecycle): require cleanup for offline providers\n\nRequire resource-owning provider ports to expose cleanup and migrate test adapters to delegate or explicitly close their own resources.\n", + "parents": ["b529bd84d727fcd5d1bd91fa4428a29a96ac780e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ace4dbf36e8c8f36a0e192aff9a11484ed428358", + "subject": "fix(contracts): align live target classification with admitted facts", + "body": "fix(contracts): align live target classification with admitted facts\n\nShare exact live target variants across open and session responses, preserving historical Evidence and snapshot admission. Consolidate equivalent ELF metadata aliases at their owner.\n", + "parents": ["fc7f042c8cae607a4d18016788c05dc4711413dd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2dd2ffcd4534e19a03db0f2e591663fe92ce5f42", + "subject": "fix(artifacts): bind operations to admitted sources", + "body": "fix(artifacts): bind operations to admitted sources\n", + "parents": ["ace4dbf36e8c8f36a0e192aff9a11484ed428358"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "077de92594cbb86f6e5e7b82fbe52d63dcfc7498", + "subject": "fix(setup): preserve selected Hopper loader arguments", + "body": "fix(setup): preserve selected Hopper loader arguments\n", + "parents": ["2dd2ffcd4534e19a03db0f2e591663fe92ce5f42"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "db0908a7321bbd695c6ea62158861ec60b944197", + "subject": "refactor(artifacts): consolidate projection and PCK interpretation", + "body": "refactor(artifacts): consolidate projection and PCK interpretation\n\nKeep historical inventory summary variants with their projection owner and share embedded PCK trailer observations while preserving each reader’s admission policy.\n", + "parents": ["077de92594cbb86f6e5e7b82fbe52d63dcfc7498"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3052a067a3e5d65470ee142234985a197ff60acb", + "subject": "fix(apple): derive NIB hierarchy from observed relationships", + "body": "fix(apple): derive NIB hierarchy from observed relationships\n\nReplace overlapping traversals with one bounded relationship owner. Preserve superview direction, treat conflicting or unsupported registry placement as unknown, and retain source facts and coverage.\n", + "parents": ["db0908a7321bbd695c6ea62158861ec60b944197"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "dbe2c97af34361b11b9504e37611dd47715b52cb", + "subject": "refactor(ownership): consolidate snapshot and comparison facts", + "body": "refactor(ownership): consolidate snapshot and comparison facts\n\nRetain authenticated immutable snapshot payloads while keeping mutable exports independent. Derive artifact metadata comparisons once and reuse the owning native trace limits.\n", + "parents": ["3052a067a3e5d65470ee142234985a197ff60acb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "08f99dbaf238264c58df79b97d0c34ac0419f43a", + "subject": "fix(setup): preserve and validate selected JEB endpoints", + "body": "fix(setup): preserve and validate selected JEB endpoints\n", + "parents": ["dbe2c97af34361b11b9504e37611dd47715b52cb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "087acf26e8eca07dfc77bb40f9540c207b1af033", + "subject": "fix(evidence): own cached snapshot data", + "body": "fix(evidence): own cached snapshot data\n", + "parents": ["08f99dbaf238264c58df79b97d0c34ac0419f43a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0dea08fb072e7a8e9bfa5a72065f688766ad2e0e", + "subject": "fix(web): interpret encoded Next route paths", + "body": "fix(web): interpret encoded Next route paths\n", + "parents": ["087acf26e8eca07dfc77bb40f9540c207b1af033"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "57d0ed45f7559fc3329a6080a92f68420ae52d63", + "subject": "fix(process): retain inherited pipes on output overflow", + "body": "fix(process): retain inherited pipes on output overflow\n", + "parents": ["0dea08fb072e7a8e9bfa5a72065f688766ad2e0e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8706068b57de06141b7d41d1b07ac63d4c7a41cc", + "subject": "fix(contracts): validate provider boundary facts consistently", + "body": "fix(contracts): validate provider boundary facts consistently\n\nCount only canonical inventory rows in binary overview, reuse the owned Objective-C coverage schemas, and share firmware input issue projection.\n", + "parents": ["57d0ed45f7559fc3329a6080a92f68420ae52d63"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0e578d43c8663be7dcb0f7f1da8dae7d44481853", + "subject": "refactor(native): retire legacy provider output wrappers", + "body": "refactor(native): retire legacy provider output wrappers\n", + "parents": ["8706068b57de06141b7d41d1b07ac63d4c7a41cc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "29ebd6740550bf3989129c39c65f17e5c61e3dd2", + "subject": "fix(native): retain cleanup failures across capability fallback", + "body": "fix(native): retain cleanup failures across capability fallback\n", + "parents": ["0e578d43c8663be7dcb0f7f1da8dae7d44481853"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "87e2cc26d893a89c7f72ac35744634bb0e2dcb7a", + "subject": "fix(environment): align comparison collection identity", + "body": "fix(environment): align comparison collection identity\n", + "parents": ["29ebd6740550bf3989129c39c65f17e5c61e3dd2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "af9bc3ab5015da3734e79f16b550b4b28297356a", + "subject": "fix(ci): validate static evidence through receipt owner", + "body": "fix(ci): validate static evidence through receipt owner\n", + "parents": ["87e2cc26d893a89c7f72ac35744634bb0e2dcb7a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "381004b6648c1a6532b3d0ae42d7ea3d52d17306", + "subject": "fix(decompile): preserve provider cleanup through export finalization", + "body": "fix(decompile): preserve provider cleanup through export finalization\n", + "parents": ["af9bc3ab5015da3734e79f16b550b4b28297356a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "95d9d51f7298f855d62c19035f4e3d6491fa9f1e", + "subject": "fix(process): retain failures through finalization", + "body": "fix(process): retain failures through finalization\n", + "parents": ["381004b6648c1a6532b3d0ae42d7ea3d52d17306"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "59a70adefd4de4fb1964d75a9bddbc2130a9a5a7", + "subject": "fix(artifacts): preserve source and coverage facts", + "body": "fix(artifacts): preserve source and coverage facts\n", + "parents": ["95d9d51f7298f855d62c19035f4e3d6491fa9f1e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e80fb638be5fcff7194455feb358dc193cbc81d7", + "subject": "fix(web): retain source-map declaration provenance", + "body": "fix(web): retain source-map declaration provenance\n", + "parents": ["59a70adefd4de4fb1964d75a9bddbc2130a9a5a7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6a9911ea77f5556b684b03de2c6747f62e9a935b", + "subject": "fix(session): track retained bundle cleanup dependencies", + "body": "fix(session): track retained bundle cleanup dependencies\n", + "parents": ["e80fb638be5fcff7194455feb358dc193cbc81d7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c74059d89fdf0872b7a02fdb6c8f1f04a754a8ba", + "subject": "fix(javascript): preserve unknown Next package ownership", + "body": "fix(javascript): preserve unknown Next package ownership\n", + "parents": ["6a9911ea77f5556b684b03de2c6747f62e9a935b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "046c4ce353fabe9eccf3ec43a5f9fc29027db05e", + "subject": "fix(javascript): preserve native export facts in comparisons", + "body": "fix(javascript): preserve native export facts in comparisons\n", + "parents": ["c74059d89fdf0872b7a02fdb6c8f1f04a754a8ba"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "84a54b61833c62f741c58e635d36e9dbfd8b8e45", + "subject": "fix(asar): preserve header filename identity", + "body": "fix(asar): preserve header filename identity\n", + "parents": ["046c4ce353fabe9eccf3ec43a5f9fc29027db05e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ecd22c42ac55287bef0f3e70561773cd4b6ba74c", + "subject": "fix(firmware): retain completed command failures", + "body": "fix(firmware): retain completed command failures\n", + "parents": ["84a54b61833c62f741c58e635d36e9dbfd8b8e45"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "52613403978e4b949d62fd14d426f3c2a075df42", + "subject": "fix(evidence): retain analysis view environment", + "body": "fix(evidence): retain analysis view environment\n", + "parents": ["ecd22c42ac55287bef0f3e70561773cd4b6ba74c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d1202c539d9a2985a55a24a4a8f91fb951e21558", + "subject": "fix(web): preserve Next route filename patterns", + "body": "fix(web): preserve Next route filename patterns\n", + "parents": ["52613403978e4b949d62fd14d426f3c2a075df42"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "11b025ef9776dd23057e505549154fea22a8a5ea", + "subject": "fix(session): retain cleanup ownership during failed opens", + "body": "fix(session): retain cleanup ownership during failed opens\n", + "parents": ["d1202c539d9a2985a55a24a4a8f91fb951e21558"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "25a08ed6393464744bd70750cdcba66d81943618", + "subject": "refactor(ida): reuse bounded registration reader", + "body": "refactor(ida): reuse bounded registration reader\n", + "parents": ["11b025ef9776dd23057e505549154fea22a8a5ea"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "eb24da4481f90f38eaf34088c721941b79ce6a99", + "subject": "fix(session): retain unknown cleanup across mixed failures", + "body": "fix(session): retain unknown cleanup across mixed failures\n", + "parents": ["25a08ed6393464744bd70750cdcba66d81943618"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b8f58fd7ca375f2dff2e5a62b409df976226611d", + "subject": "refactor(mcp): bind summary delivery to tool contracts", + "body": "refactor(mcp): bind summary delivery to tool contracts\n", + "parents": ["eb24da4481f90f38eaf34088c721941b79ce6a99"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8a47cbbcce538f511609b90b5d40bd00920b3216", + "subject": "fix(artifacts): deduplicate keyed archive selector choices", + "body": "fix(artifacts): deduplicate keyed archive selector choices\n", + "parents": ["b8f58fd7ca375f2dff2e5a62b409df976226611d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7fa54e2d62bf277ecdd8d75a2f3b60de24344591", + "subject": "fix(process): preserve command completion and input ownership", + "body": "fix(process): preserve command completion and input ownership\n", + "parents": ["8a47cbbcce538f511609b90b5d40bd00920b3216"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2ad599daceb238347d379f81ca170cf662901a49", + "subject": "fix(snapshot): export only target-bound observations", + "body": "fix(snapshot): export only target-bound observations\n", + "parents": ["7fa54e2d62bf277ecdd8d75a2f3b60de24344591"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "68533bc0a3ba6b6b55d5406508c0a59e6f52819b", + "subject": "refactor(evidence): share subject architecture declarations", + "body": "refactor(evidence): share subject architecture declarations\n", + "parents": ["2ad599daceb238347d379f81ca170cf662901a49"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9222526fe234526edc036459b9e8df922fb72863", + "subject": "fix(electron): retain selected scenario paths in evidence", + "body": "fix(electron): retain selected scenario paths in evidence\n", + "parents": ["68533bc0a3ba6b6b55d5406508c0a59e6f52819b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8c8a2752c0bcee5c07042a7ee45dba31597641bf", + "subject": "refactor(artifacts): retain admitted PyInstaller cookie facts", + "body": "refactor(artifacts): retain admitted PyInstaller cookie facts\n", + "parents": ["9222526fe234526edc036459b9e8df922fb72863"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "69b328eec8904ecd40eb713b09d0cd523951cdc0", + "subject": "test(browser): verify out-of-order response correlation", + "body": "test(browser): verify out-of-order response correlation\n", + "parents": ["8c8a2752c0bcee5c07042a7ee45dba31597641bf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5d25aa4f5213ed75d417e4fe60a18b3b32f2aabe", + "subject": "refactor(artifacts): retain admitted Godot pack location", + "body": "refactor(artifacts): retain admitted Godot pack location\n", + "parents": ["69b328eec8904ecd40eb713b09d0cd523951cdc0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5b8e4154836c6e26f97c9cf503879fa12f097669", + "subject": "refactor(snapshot): centralize resource cache eligibility", + "body": "refactor(snapshot): centralize resource cache eligibility\n", + "parents": ["5d25aa4f5213ed75d417e4fe60a18b3b32f2aabe"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ee654e98a6fbde73072fb35d915f46c87486b0ce", + "subject": "refactor(artifacts): retain PyInstaller carrier dialect", + "body": "refactor(artifacts): retain PyInstaller carrier dialect\n", + "parents": ["5b8e4154836c6e26f97c9cf503879fa12f097669"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "60822e07023d08aac2545bf4353d375bc4f7093c", + "subject": "fix(doctor): preserve Homebrew application paths", + "body": "fix(doctor): preserve Homebrew application paths\n", + "parents": ["ee654e98a6fbde73072fb35d915f46c87486b0ce"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3fcbabe593611435ebc26e1eac86706fe60abb6e", + "subject": "feat(browser): reuse saved response values across scenario steps (#7267)", + "body": "feat(browser): reuse saved response values across scenario steps (#7267)\n\nSave typed response fields and reuse generated IDs or authentication values across browser scenario requests, UI observations and navigation through the shared CLI/MCP workflow.\n\nPreserve exact numbers, retained Evidence, explicit source/coverage limits and prospective page-value semantics. Bound response decoding, retained spellings and request serialization before allocation, and protect marked response values across source records, follow-up text and planned screenshots.\n\nIntegrates Edgar Arakelyan's #7162, including follow-ups through 9f5191ab0. Final local validation: 560 feature-branch tests and 561 current-main integration tests, static/build/docs checks and real PocketBase CLI/MCP privacy workflows. Whole-task comparison and verification limits are recorded in docs/verification/browser-saved-values-2026-10-26.md.\n\nCo-authored-by: Edgar Arakelyan ", + "parents": ["60822e07023d08aac2545bf4353d375bc4f7093c"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "Edgar Arakelyan", + "email": "edgar.arakelyan@scale.com", + "user": { + "login": "earakely-scale", + "__typename": "User" + } + } + ], + "pullRequests": [7267] + }, + { + "sha": "cb0c73246d360ce4ab363b67bd02564e69368153", + "subject": "refactor(artifacts): reuse admitted sources for extraction", + "body": "refactor(artifacts): reuse admitted sources for extraction\n", + "parents": ["3fcbabe593611435ebc26e1eac86706fe60abb6e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e7f29f8b8f36acfccc10003ef3d6f50ace0f0431", + "subject": "fix(zip): validate admitted source throughout reads", + "body": "fix(zip): validate admitted source throughout reads\n", + "parents": ["cb0c73246d360ce4ab363b67bd02564e69368153"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "34315410734627f3895e2181714190381f9df4ce", + "subject": "fix(views): honor cancellation before admission", + "body": "fix(views): honor cancellation before admission\n", + "parents": ["e7f29f8b8f36acfccc10003ef3d6f50ace0f0431"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0ddde829b2a4ceb6ad1f883d1dd2aebb7305ac2e", + "subject": "fix(session): preserve failed target restoration", + "body": "fix(session): preserve failed target restoration\n", + "parents": ["34315410734627f3895e2181714190381f9df4ce"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "abc135150628ab62d271324682426fe7ec5fed3a", + "subject": "fix(artifacts): distinguish incomplete PyInstaller probes", + "body": "fix(artifacts): distinguish incomplete PyInstaller probes\n", + "parents": ["0ddde829b2a4ceb6ad1f883d1dd2aebb7305ac2e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6b3a081f3699b7ba02b6df66dd668b7470a8e78e", + "subject": "fix(flutter): retain snapshot cleanup ownership", + "body": "fix(flutter): retain snapshot cleanup ownership\n", + "parents": ["abc135150628ab62d271324682426fe7ec5fed3a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f347713e24d6bccb72d2212408f38ef18eaa65ed", + "subject": "refactor(session): share provider replay attribution", + "body": "refactor(session): share provider replay attribution\n", + "parents": ["6b3a081f3699b7ba02b6df66dd668b7470a8e78e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "87d023dcc858b479a9d6b8d703472bedbc7ca9f6", + "subject": "fix(flutter): honor cancellation after cleanup retry", + "body": "fix(flutter): honor cancellation after cleanup retry\n", + "parents": ["f347713e24d6bccb72d2212408f38ef18eaa65ed"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0781c3e99cb898472ca20e1339e77a1ed7df6aab", + "subject": "fix(reference): validate Git metadata path traversal", + "body": "fix(reference): validate Git metadata path traversal\n", + "parents": ["87d023dcc858b479a9d6b8d703472bedbc7ca9f6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "54fbfacfb1621a2cdf500616eb421db17570b671", + "subject": "fix(macho): preserve leading spaces in export identities", + "body": "fix(macho): preserve leading spaces in export identities\n", + "parents": ["0781c3e99cb898472ca20e1339e77a1ed7df6aab"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "838f5f44d272613f58770e4e4f591b0d778a458c", + "subject": "fix(reference): preserve incomplete resolution uncertainty", + "body": "fix(reference): preserve incomplete resolution uncertainty\n", + "parents": ["54fbfacfb1621a2cdf500616eb421db17570b671"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ad92e0f9c8029d08cb11dea539803f4de5686c3c", + "subject": "refactor(ghidra): consolidate function containment lookup", + "body": "refactor(ghidra): consolidate function containment lookup\n", + "parents": ["838f5f44d272613f58770e4e4f591b0d778a458c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e3044645c779e0e776034b172506e963eb195203", + "subject": "fix(managed): retain local signature comparison coverage", + "body": "fix(managed): retain local signature comparison coverage\n", + "parents": ["ad92e0f9c8029d08cb11dea539803f4de5686c3c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "06642a48fbdfa7ba15eb5b2c60cb22382186c3f0", + "subject": "fix(hopper): preserve selected home and cache paths", + "body": "fix(hopper): preserve selected home and cache paths\n", + "parents": ["e3044645c779e0e776034b172506e963eb195203"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d109a3910522db9927e4160f9b22669cb2cda0d4", + "subject": "feat(cli): validate browser scenarios offline (#7343)", + "body": "feat(cli): validate browser scenarios offline (#7343)\n\nAdd validate-browser-scenario for offline schema and semantic checks of inline JSON, local files and stdin. Return compact validity/action/secret counts without reading secret values or discovering, launching, attaching to or navigating a browser.\n\nExecution and validation share CLI input admission and the canonical domain schema. Preserve existing capture lifecycle, diagnostics, cancellation and caller-relative executable paths.\n\nIntegrates #7149 with attribution. Fixes #5488. Validation includes 24 focused tests, static/build/docs checks, and the preserved real PocketBase scenario with its backend stopped and secret variables unset. Verification and resource/token measurements are recorded in docs/verification/browser-scenario-validation-2026-10-27.md.\n\nCo-authored-by: Ace <1160684883@qq.com>", + "parents": ["06642a48fbdfa7ba15eb5b2c60cb22382186c3f0"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "Ace", + "email": "1160684883@qq.com", + "user": { + "login": "z2Ace0107", + "__typename": "User" + } + } + ], + "pullRequests": [7343] + }, + { + "sha": "4932e5615b5026b5508943de31f29999f0b41efe", + "subject": "fix(update): preserve Bun global directory identity", + "body": "fix(update): preserve Bun global directory identity\n", + "parents": ["d109a3910522db9927e4160f9b22669cb2cda0d4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "781eb1b28a5bcfdd0710662bc91a43cd31165f4d", + "subject": "fix(browser): validate basic credential usernames", + "body": "fix(browser): validate basic credential usernames\n", + "parents": ["4932e5615b5026b5508943de31f29999f0b41efe"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "aa253bd13fb2b57d7ed426df734c5d30f6babec5", + "subject": "fix(electron): scope IPC pairing to application ownership", + "body": "fix(electron): scope IPC pairing to application ownership\n", + "parents": ["781eb1b28a5bcfdd0710662bc91a43cd31165f4d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b2df588b4a7ec798a7a92d3c466f570d582eaeed", + "subject": "fix(gpu): retain AMD target declaration evidence", + "body": "fix(gpu): retain AMD target declaration evidence\n", + "parents": ["aa253bd13fb2b57d7ed426df734c5d30f6babec5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "339b82e0c867c933a3055ad33e33cda9d20eb857", + "subject": "fix(cutter): preserve bridge directory traversal", + "body": "fix(cutter): preserve bridge directory traversal\n", + "parents": ["b2df588b4a7ec798a7a92d3c466f570d582eaeed"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "72cc2d30a390e37cf8186582e15e0ab97de6ab4b", + "subject": "fix(browser): preserve request and cleanup failures", + "body": "fix(browser): preserve request and cleanup failures\n", + "parents": ["339b82e0c867c933a3055ad33e33cda9d20eb857"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5cd61aac8ea28ce8a2c3a76d3706077c8cfdaacc", + "subject": "fix(artifacts): preserve cancellation during inventory cleanup", + "body": "fix(artifacts): preserve cancellation during inventory cleanup\n", + "parents": ["72cc2d30a390e37cf8186582e15e0ab97de6ab4b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "bf7721080fa671a5c1f728d37ed6b6d3124c5740", + "subject": "refactor(evidence): centralize value flow metadata schema", + "body": "refactor(evidence): centralize value flow metadata schema\n", + "parents": ["5cd61aac8ea28ce8a2c3a76d3706077c8cfdaacc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6d7e6277835448bcdc830d00ebced2ff76a74c92", + "subject": "fix(cli): preserve literal evidence in Markdown output", + "body": "fix(cli): preserve literal evidence in Markdown output\n", + "parents": ["bf7721080fa671a5c1f728d37ed6b6d3124c5740"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "39179db68d002a2ba4d3f90321b9905d44eb0707", + "subject": "refactor(artifacts): unify inventory integrity policy", + "body": "refactor(artifacts): unify inventory integrity policy\n", + "parents": ["6d7e6277835448bcdc830d00ebced2ff76a74c92"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5cf7133f823bce2a3e42a6e1d0c8418e5ff9908d", + "subject": "refactor(javascript)!: consolidate renderer and route ownership", + "body": "refactor(javascript)!: consolidate renderer and route ownership\n\nRemove the derived package renderer property from new application graphs. Use renderer_declarations for source fields and package loads edges for the selected candidate; previously retained Evidence remains readable.\n", + "parents": ["39179db68d002a2ba4d3f90321b9905d44eb0707"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9c9c64edfac68f549c7f69b199ea2940fd7c2b50", + "subject": "refactor(views): centralize paging contracts", + "body": "refactor(views): centralize paging contracts\n", + "parents": ["5cf7133f823bce2a3e42a6e1d0c8418e5ff9908d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9cad06db10385b6603be5a7ada8d07838c2cbb71", + "subject": "fix(managed): retain qualified native candidates", + "body": "fix(managed): retain qualified native candidates\n", + "parents": ["9c9c64edfac68f549c7f69b199ea2940fd7c2b50"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0e1500dc8d2ace183cb34058e058eba97c21c781", + "subject": "fix(javascript): qualify renderer endpoint observations", + "body": "fix(javascript): qualify renderer endpoint observations\n", + "parents": ["9cad06db10385b6603be5a7ada8d07838c2cbb71"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "329325049c8eaacb584729ed3a229e400d4f47c2", + "subject": "refactor(cli): retain typed analysis outcomes through delivery", + "body": "refactor(cli): retain typed analysis outcomes through delivery\n", + "parents": ["0e1500dc8d2ace183cb34058e058eba97c21c781"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4266d327511dcf1dbcd0c17baf4d36228d54fc7d", + "subject": "fix(cli): retain resources from both cleanup failures", + "body": "fix(cli): retain resources from both cleanup failures\n", + "parents": ["329325049c8eaacb584729ed3a229e400d4f47c2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a52914649a5debce3694f81d4bf4bcf9f889d1e6", + "subject": "fix(native): use owned address grammar for coordinates", + "body": "fix(native): use owned address grammar for coordinates\n", + "parents": ["4266d327511dcf1dbcd0c17baf4d36228d54fc7d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "01484bc95c18670c7896cc08c4398f41e7af9374", + "subject": "fix(setup): unify macOS version eligibility", + "body": "fix(setup): unify macOS version eligibility\n", + "parents": ["a52914649a5debce3694f81d4bf4bcf9f889d1e6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e2da92f5d233f914b9677f2db14ba994933f47f3", + "subject": "fix(javascript): unify runtime module declarations", + "body": "fix(javascript): unify runtime module declarations\n", + "parents": ["01484bc95c18670c7896cc08c4398f41e7af9374"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "212479aa02bc80320ce4552bf3806266564f0da1", + "subject": "refactor(environment): reuse recorded query parser", + "body": "refactor(environment): reuse recorded query parser\n", + "parents": ["e2da92f5d233f914b9677f2db14ba994933f47f3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f68b261db4e2c5f1b15ef652c676b8bec23fd8a0", + "subject": "refactor(process): remove unused worker PID state", + "body": "refactor(process): remove unused worker PID state\n", + "parents": ["212479aa02bc80320ce4552bf3806266564f0da1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a293738c6686bf3d6c5c163ec552d29fd5bb2485", + "subject": "fix(electron): preserve symlink directory requirements", + "body": "fix(electron): preserve symlink directory requirements\n", + "parents": ["f68b261db4e2c5f1b15ef652c676b8bec23fd8a0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "25b69bb803ffe337cca705629ec88cd220ca09a7", + "subject": "fix(javascript): qualify network receiver evidence", + "body": "fix(javascript): qualify network receiver evidence\n", + "parents": ["a293738c6686bf3d6c5c163ec552d29fd5bb2485"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "fef83241b1025559097845c8603e6309f4abea96", + "subject": "fix(setup): validate Hopper download channel URLs", + "body": "fix(setup): validate Hopper download channel URLs\n", + "parents": ["25b69bb803ffe337cca705629ec88cd220ca09a7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "55b4efcb88bb3278e141af774a4be5622eecb783", + "subject": "fix(providers): retain completed cleanup observations", + "body": "fix(providers): retain completed cleanup observations\n", + "parents": ["fef83241b1025559097845c8603e6309f4abea96"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9eb8ba2b29ac1d574d26a6165cd3b8480ab03d78", + "subject": "refactor(cli): use builtin argument owner directly", + "body": "refactor(cli): use builtin argument owner directly\n", + "parents": ["55b4efcb88bb3278e141af774a4be5622eecb783"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9be640a8b42cf81ace04d2b97eae3ec28cfc897a", + "subject": "fix(providers): preserve selected filesystem identities", + "body": "fix(providers): preserve selected filesystem identities\n", + "parents": ["9eb8ba2b29ac1d574d26a6165cd3b8480ab03d78"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "242a0f2880abe253758ddb85dc038e2d5e3fb7e0", + "subject": "fix(evidence): retain comparison cleanup ownership", + "body": "fix(evidence): retain comparison cleanup ownership\n", + "parents": ["9be640a8b42cf81ace04d2b97eae3ec28cfc897a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "83bbad2b2ffe014bea750d79efe7143c8e8fe069", + "subject": "fix(browser): advance storage pages by examined rows", + "body": "fix(browser): advance storage pages by examined rows\n", + "parents": ["242a0f2880abe253758ddb85dc038e2d5e3fb7e0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6734dee6a8579e8d818d5cde99d8509a3f2f0f42", + "subject": "fix(managed): retain comparison target cleanup ownership", + "body": "fix(managed): retain comparison target cleanup ownership\n", + "parents": ["83bbad2b2ffe014bea750d79efe7143c8e8fe069"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6979c589b06dcef6525e125c2c61ea2735715285", + "subject": "fix(ghidra): preserve project access failures", + "body": "fix(ghidra): preserve project access failures\n", + "parents": ["6734dee6a8579e8d818d5cde99d8509a3f2f0f42"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7ba1d0161e25b04fadb5ab94e05943c1b42d88cd", + "subject": "fix(browser): retain ambiguous scenario request identity", + "body": "fix(browser): retain ambiguous scenario request identity\n", + "parents": ["6979c589b06dcef6525e125c2c61ea2735715285"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "01d6a95fd7df6065562b8f087082f5d2062cb468", + "subject": "fix(ghidra): preserve configured seed path traversal", + "body": "fix(ghidra): preserve configured seed path traversal\n", + "parents": ["7ba1d0161e25b04fadb5ab94e05943c1b42d88cd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "443d0778be5922b6ef0e522805ac4002da5edf19", + "subject": "fix(browser): resolve JSON pointers through array elements", + "body": "fix(browser): resolve JSON pointers through array elements\n", + "parents": ["01d6a95fd7df6065562b8f087082f5d2062cb468"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "27ac1b67810400ecf5abc670ad02d920df0e0218", + "subject": "refactor(contracts): consolidate tool effect definitions", + "body": "refactor(contracts): consolidate tool effect definitions\n", + "parents": ["443d0778be5922b6ef0e522805ac4002da5edf19"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f3a301eca5d126f072a481dfb053f5e80f29290a", + "subject": "fix(artifacts): validate selected path traversal", + "body": "fix(artifacts): validate selected path traversal\n", + "parents": ["27ac1b67810400ecf5abc670ad02d920df0e0218"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "15a8f6847ccac581c7ff717b42062a54b1ba8084", + "subject": "fix(browser): reject inexact storage values", + "body": "fix(browser): reject inexact storage values\n", + "parents": ["f3a301eca5d126f072a481dfb053f5e80f29290a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f878266503e5eef3e9dca6ec85126f83d60b41c9", + "subject": "fix(artifacts): admit selected app bundle traversal", + "body": "fix(artifacts): admit selected app bundle traversal\n", + "parents": ["15a8f6847ccac581c7ff717b42062a54b1ba8084"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a905a71e31f71457cb21fd056b234f872126974e", + "subject": "fix(plist): preserve binary UID and dictionary identity", + "body": "fix(plist): preserve binary UID and dictionary identity\n", + "parents": ["f878266503e5eef3e9dca6ec85126f83d60b41c9"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c1e0f531e600c7899d51f675d6fa2fef6f3aebb9", + "subject": "fix(firmware): admit caller-selected source directly", + "body": "fix(firmware): admit caller-selected source directly\n", + "parents": ["a905a71e31f71457cb21fd056b234f872126974e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8e0b2a9765a0d94fec8bd84513a14ea5d65721eb", + "subject": "fix(wasm): share WAT comment framing", + "body": "fix(wasm): share WAT comment framing\n", + "parents": ["c1e0f531e600c7899d51f675d6fa2fef6f3aebb9"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ed62f14be401f6048bb1ccc89ac2afdddb557f3e", + "subject": "refactor(ci): consolidate lint task ownership", + "body": "refactor(ci): consolidate lint task ownership\n", + "parents": ["8e0b2a9765a0d94fec8bd84513a14ea5d65721eb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2146caeb3d8da645d608b5adae8947215a511766", + "subject": "fix(electron): share ASAR node validation", + "body": "fix(electron): share ASAR node validation\n", + "parents": ["ed62f14be401f6048bb1ccc89ac2afdddb557f3e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "650873e772034a62df1623892be56bbafe74aa83", + "subject": "fix(artifacts): preserve mounted DMG traversal coverage", + "body": "fix(artifacts): preserve mounted DMG traversal coverage\n", + "parents": ["2146caeb3d8da645d608b5adae8947215a511766"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c81b7ecebcee30996b0d8f2d0d7f17a802ef5739", + "subject": "fix(electron): refuse linked ASAR parent declarations", + "body": "fix(electron): refuse linked ASAR parent declarations\n", + "parents": ["650873e772034a62df1623892be56bbafe74aa83"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9aee546aba7e84cb63f593f4839f41701c91c7bf", + "subject": "refactor(process): unify trace outcome comparison", + "body": "refactor(process): unify trace outcome comparison\n", + "parents": ["c81b7ecebcee30996b0d8f2d0d7f17a802ef5739"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8dc4421325bc467811884c78510de8617e234ee3", + "subject": "fix(artifacts): reject inventory counts beyond manifest", + "body": "fix(artifacts): reject inventory counts beyond manifest\n", + "parents": ["9aee546aba7e84cb63f593f4839f41701c91c7bf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "bfdde7ee4c3468b7241aab0b9d53663e82b4a811", + "subject": "refactor(web): centralize isolated script paths", + "body": "refactor(web): centralize isolated script paths\n", + "parents": ["8dc4421325bc467811884c78510de8617e234ee3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d1c88fab1a3c2fb8c1d7df78744a2ad5d755eca2", + "subject": "fix(artifacts): validate partial inventory root identity", + "body": "fix(artifacts): validate partial inventory root identity\n", + "parents": ["bfdde7ee4c3468b7241aab0b9d53663e82b4a811"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "25fc08189ec92a1f2e8642697b19af2194fb1190", + "subject": "fix(wasm): parse interface group heads consistently", + "body": "fix(wasm): parse interface group heads consistently\n", + "parents": ["d1c88fab1a3c2fb8c1d7df78744a2ad5d755eca2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f53c25688676e5ba343483ca4894ccd46834f5c6", + "subject": "fix(macho): unify fixed-width name decoding", + "body": "fix(macho): unify fixed-width name decoding\n", + "parents": ["25fc08189ec92a1f2e8642697b19af2194fb1190"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6749bd090dc1b5a31ad60a8932e8fbad48f814e6", + "subject": "fix(browser): keep opaque cookie partitions unaligned (#7203)", + "body": "fix(browser): keep opaque cookie partitions unaligned (#7203)\n\nKeep cookies with opaque partitions distinct from unpartitioned identities while retaining value hashes and incomplete comparison coverage. Preserve known partition hashes and use the existing shared CLI/MCP fingerprint owner.\n\nValidated with 63 source and 57 storage boundary tests, builds/static checks, and real Chrome156 CLI/MCP controls. Live opaque-cookie emission was not reproduced; its protocol regression is explicit. Hosted CI's unrelated failures were reproduced against exact main a905a71e3; seven fail-fast-cancelled shards remain unverified; Greptile's sole existing-main finding was scoped and documented. Human readiness remains unasserted; bypass authorized by the requester.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["f53c25688676e5ba343483ca4894ccd46834f5c6"], + "authors": [ + { + "name": "Rudy Mizrahi Celekli", + "email": "47457359+rudycelekli@users.noreply.github.com", + "user": { + "login": "rudycelekli", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7203] + }, + { + "sha": "b7cae1ad8c6ca5a988340a6e8eca06ee6f93a955", + "subject": "fix(artifacts): validate partial inventory edges", + "body": "fix(artifacts): validate partial inventory edges\n", + "parents": ["6749bd090dc1b5a31ad60a8932e8fbad48f814e6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ded6542d93a05321b582934c804a91b76a32a0b8", + "subject": "refactor(plist): unify number source association", + "body": "refactor(plist): unify number source association\n", + "parents": ["b7cae1ad8c6ca5a988340a6e8eca06ee6f93a955"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b0c48e8b6524a809e51acdca155e253b9fe73f14", + "subject": "fix(native): preserve mapping and literal coverage", + "body": "fix(native): preserve mapping and literal coverage\n", + "parents": ["ded6542d93a05321b582934c804a91b76a32a0b8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4f2fc7ca28d047704bbe0276ed0af40b36249084", + "subject": "refactor(pe): rely on path input contracts", + "body": "refactor(pe): rely on path input contracts\n", + "parents": ["b0c48e8b6524a809e51acdca155e253b9fe73f14"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "30216468ccb7660f54964ff17cf8834c86da673b", + "subject": "fix(browser): share media type interpretation", + "body": "fix(browser): share media type interpretation\n", + "parents": ["4f2fc7ca28d047704bbe0276ed0af40b36249084"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3655dfd7d5db25f52a0a68c2651527d80935be2d", + "subject": "fix(elf): validate completed note coverage", + "body": "fix(elf): validate completed note coverage\n", + "parents": ["30216468ccb7660f54964ff17cf8834c86da673b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "413f24b53284d28a64c8f4cef48123cb66d57c07", + "subject": "fix(artifacts): unify selected path failure classification", + "body": "fix(artifacts): unify selected path failure classification\n", + "parents": ["3655dfd7d5db25f52a0a68c2651527d80935be2d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5093d51c057ea7dfc89f919a01af3cb4cc482a79", + "subject": "refactor(browser): share CDP script source capture", + "body": "refactor(browser): share CDP script source capture\n", + "parents": ["413f24b53284d28a64c8f4cef48123cb66d57c07"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ec40c10749b5c4091fb08bc28c6f3f38c2a6968e", + "subject": "refactor(process): share comparison dimension projections", + "body": "refactor(process): share comparison dimension projections\n", + "parents": ["5093d51c057ea7dfc89f919a01af3cb4cc482a79"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "92213a91557a8ea378757a97ac0a1a34b94332ef", + "subject": "test(artifacts): verify evidence refresh after reopen", + "body": "test(artifacts): verify evidence refresh after reopen\n", + "parents": ["ec40c10749b5c4091fb08bc28c6f3f38c2a6968e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b7be0d90a907b5e66711df938ef092c59658ba09", + "subject": "fix(firmware): retain nested dependency diagnostics", + "body": "fix(firmware): retain nested dependency diagnostics\n", + "parents": ["92213a91557a8ea378757a97ac0a1a34b94332ef"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f061989ad255c994e0e2eec072150b5374a2c5f5", + "subject": "fix(artifacts): validate bundle resource target identity", + "body": "fix(artifacts): validate bundle resource target identity\n", + "parents": ["b7be0d90a907b5e66711df938ef092c59658ba09"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "79b8219f290ef6304e469d9b8c40dc2af30edba9", + "subject": "fix(certificates): unify OID decoding and validate reports", + "body": "fix(certificates): unify OID decoding and validate reports\n", + "parents": ["f061989ad255c994e0e2eec072150b5374a2c5f5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6fa8e2ee3d312073484d232af232cf6d45a7ebe7", + "subject": "refactor(node-sea): reuse Mach-O segment facts", + "body": "refactor(node-sea): reuse Mach-O segment facts\n", + "parents": ["79b8219f290ef6304e469d9b8c40dc2af30edba9"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b989e3c3a38fef51968b2706f8fb94c335f83190", + "subject": "fix(browser): parse HTTP Link whitespace correctly", + "body": "fix(browser): parse HTTP Link whitespace correctly\n", + "parents": ["6fa8e2ee3d312073484d232af232cf6d45a7ebe7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0e17aab45196eb298e761f9ed0e846404e01eefa", + "subject": "fix(providers): deduplicate nested cleanup notifications", + "body": "fix(providers): deduplicate nested cleanup notifications\n", + "parents": ["b989e3c3a38fef51968b2706f8fb94c335f83190"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "bae84d1b937c4b3c053b54ad3a422fc4b9ca0362", + "subject": "fix(native): validate plist target identity", + "body": "fix(native): validate plist target identity\n", + "parents": ["0e17aab45196eb298e761f9ed0e846404e01eefa"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "37d6e8ca9a6f5e953bb47f2883881b0426e77931", + "subject": "refactor(macho): reuse admitted header identity", + "body": "refactor(macho): reuse admitted header identity\n", + "parents": ["bae84d1b937c4b3c053b54ad3a422fc4b9ca0362"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e4cdf65e2cb35d005b247e7c471ee206786e2014", + "subject": "refactor(mcp): share diagnostic evidence handling", + "body": "refactor(mcp): share diagnostic evidence handling\n", + "parents": ["37d6e8ca9a6f5e953bb47f2883881b0426e77931"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "82d3ab7aa8a41e702a876004be3e73d61ed70443", + "subject": "fix(browser): respect response metadata grammars", + "body": "fix(browser): respect response metadata grammars\n", + "parents": ["e4cdf65e2cb35d005b247e7c471ee206786e2014"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1fdd3df7b4eb5b0a1e15f071c8d786c8e9ec2717", + "subject": "fix(hopper): preserve regex inventory facts", + "body": "fix(hopper): preserve regex inventory facts\n", + "parents": ["82d3ab7aa8a41e702a876004be3e73d61ed70443"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f8f7ac96de8a66a4ab9a23d87e04779bfcd11045", + "subject": "refactor(mcp): share entropy summary delivery", + "body": "refactor(mcp): share entropy summary delivery\n", + "parents": ["1fdd3df7b4eb5b0a1e15f071c8d786c8e9ec2717"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3c0e021cb32bbdf8eaa8f9406ab9ed93eedcfd74", + "subject": "refactor(captures): retain SAZ member classifications", + "body": "refactor(captures): retain SAZ member classifications\n", + "parents": ["f8f7ac96de8a66a4ab9a23d87e04779bfcd11045"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e58feb48c32c41d3bd75e28efdab6c1650922f7a", + "subject": "refactor(mcp): reuse reverse engineering admission", + "body": "refactor(mcp): reuse reverse engineering admission\n", + "parents": ["3c0e021cb32bbdf8eaa8f9406ab9ed93eedcfd74"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6207843814e5267e3a1d9796d5800346f69dc7da", + "subject": "fix(ida): preserve Unicode literal search matches", + "body": "fix(ida): preserve Unicode literal search matches\n", + "parents": ["e58feb48c32c41d3bd75e28efdab6c1650922f7a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "768b58c6dbb7092b71ad04acd9d015bc4fcc27e3", + "subject": "fix(setup): honor Droid home override", + "body": "fix(setup): honor Droid home override\n", + "parents": ["6207843814e5267e3a1d9796d5800346f69dc7da"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "17da88f1170b53caf35bd8f89ff14713e7398c09", + "subject": "fix(process): report retained capture root", + "body": "fix(process): report retained capture root\n", + "parents": ["768b58c6dbb7092b71ad04acd9d015bc4fcc27e3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "92fb319b27fdc43d471eed3cafa05c471d6296bc", + "subject": "refactor(gdb): reuse inferior identity reader", + "body": "refactor(gdb): reuse inferior identity reader\n", + "parents": ["17da88f1170b53caf35bd8f89ff14713e7398c09"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1635e559d2708306e9813ad0a1d3b0fb070bc15c", + "subject": "refactor(go): simplify build metadata decoding", + "body": "refactor(go): simplify build metadata decoding\n", + "parents": ["92fb319b27fdc43d471eed3cafa05c471d6296bc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "492860ed0787054b3c6471331d396c75c5e6caf7", + "subject": "test(captures): assert retained snapshot evidence", + "body": "test(captures): assert retained snapshot evidence\n", + "parents": ["1635e559d2708306e9813ad0a1d3b0fb070bc15c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0d1d6e858d35803c342cbf6ab47723a4dc714a96", + "subject": "fix(ghidra): unify Unicode literal search semantics", + "body": "fix(ghidra): unify Unicode literal search semantics\n", + "parents": ["492860ed0787054b3c6471331d396c75c5e6caf7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "52b3c634954f31b17267d764e2882a182d817619", + "subject": "fix(ida): complete private input writes", + "body": "fix(ida): complete private input writes\n", + "parents": ["0d1d6e858d35803c342cbf6ab47723a4dc714a96"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "76441ed31b282e5b0f31c0679764277c71884400", + "subject": "fix(browser): preserve comparison evidence identity", + "body": "fix(browser): preserve comparison evidence identity\n", + "parents": ["52b3c634954f31b17267d764e2882a182d817619"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a18297f7d1a0029f9ebafbb0876d2e2ae0db31a7", + "subject": "refactor(electron): use required native module facts", + "body": "refactor(electron): use required native module facts\n", + "parents": ["76441ed31b282e5b0f31c0679764277c71884400"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "081f2e2559db4802ffdb8783f6bc8d6803eb8c3d", + "subject": "refactor(process): share stable file identity checks", + "body": "refactor(process): share stable file identity checks\n", + "parents": ["a18297f7d1a0029f9ebafbb0876d2e2ae0db31a7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "76eecf7fa175023b7315f40bc7582baea401c2e2", + "subject": "fix(mcp): advertise standard route path schemas", + "body": "fix(mcp): advertise standard route path schemas\n", + "parents": ["081f2e2559db4802ffdb8783f6bc8d6803eb8c3d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "fe95b7611f794005deb23ad511607742fc829712", + "subject": "fix(process): retain lease directory cleanup ownership", + "body": "fix(process): retain lease directory cleanup ownership\n", + "parents": ["76eecf7fa175023b7315f40bc7582baea401c2e2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7b25049deefe4415c5e86a557c8d8de8185d12ab", + "subject": "refactor(browser): centralize passive source deadlines", + "body": "refactor(browser): centralize passive source deadlines\n", + "parents": ["fe95b7611f794005deb23ad511607742fc829712"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "86d4a21215cb0fbafaf555b5c7d9fcda3f255d82", + "subject": "docs(search): clarify provider case folding", + "body": "docs(search): clarify provider case folding\n", + "parents": ["7b25049deefe4415c5e86a557c8d8de8185d12ab"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5d5fef7391122925f3f184ae88f0e4c298f8b679", + "subject": "fix(process): retain lease recovery cleanup owners", + "body": "fix(process): retain lease recovery cleanup owners\n", + "parents": ["86d4a21215cb0fbafaf555b5c7d9fcda3f255d82"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "319fee4691e444d5ac9870f114f93f79ef89707b", + "subject": "fix(electron): select nested handlers by source coordinates", + "body": "fix(electron): select nested handlers by source coordinates\n", + "parents": ["5d5fef7391122925f3f184ae88f0e4c298f8b679"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f812dc4135e6b915135c218a9bd1886f8e5e00f7", + "subject": "fix(hopper): retain lease after startup failure", + "body": "fix(hopper): retain lease after startup failure\n", + "parents": ["319fee4691e444d5ac9870f114f93f79ef89707b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4de432d868293622794d66704de0939a05fbfc81", + "subject": "refactor(pyinstaller): preserve parsed compression flags", + "body": "refactor(pyinstaller): preserve parsed compression flags\n", + "parents": ["f812dc4135e6b915135c218a9bd1886f8e5e00f7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f2277454b8c5356abbe311ad6dbb1dd3a3e334a5", + "subject": "fix(setup): preserve unowned client registrations", + "body": "fix(setup): preserve unowned client registrations\n", + "parents": ["4de432d868293622794d66704de0939a05fbfc81"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d2da71385955b86b2c7a669e917987bfb7916afc", + "subject": "fix(setup): recognize inherited owned launcher", + "body": "fix(setup): recognize inherited owned launcher\n", + "parents": ["f2277454b8c5356abbe311ad6dbb1dd3a3e334a5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a116f2a7ae8e7ae18b6d0a24211abdb2b920a7db", + "subject": "fix(process): close lease peers during release", + "body": "fix(process): close lease peers during release\n", + "parents": ["d2da71385955b86b2c7a669e917987bfb7916afc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a486cfe51804f221ce66ddfcaa1a0fac6e7362ab", + "subject": "fix(windows): validate declared PE header identity", + "body": "fix(windows): validate declared PE header identity\n", + "parents": ["a116f2a7ae8e7ae18b6d0a24211abdb2b920a7db"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4e33bd3e081f56ae223bc22491ce81630dc072e5", + "subject": "fix(browser): preserve discovery identity ambiguity", + "body": "fix(browser): preserve discovery identity ambiguity\n", + "parents": ["a486cfe51804f221ce66ddfcaa1a0fac6e7362ab"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c79bd41b5d6d65b7b2a9b6e0b58d376fc36910d6", + "subject": "test(hopper): verify bootstrap cleanup ownership", + "body": "test(hopper): verify bootstrap cleanup ownership\n", + "parents": ["4e33bd3e081f56ae223bc22491ce81630dc072e5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "cd7a0eefd8c5d54579ab63e0e934c730fda55459", + "subject": "fix(apple): validate JVM interface identity", + "body": "fix(apple): validate JVM interface identity\n", + "parents": ["c79bd41b5d6d65b7b2a9b6e0b58d376fc36910d6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a6a69ec63e0b9f2742d9b39534e2dfc02b6a0814", + "subject": "fix(ghidra): require Windows cleanup ownership", + "body": "fix(ghidra): require Windows cleanup ownership\n", + "parents": ["cd7a0eefd8c5d54579ab63e0e934c730fda55459"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8aa6df2d86fe3deb295227a4d482da1bc819e53e", + "subject": "fix(native): share otool build tool parsing", + "body": "fix(native): share otool build tool parsing\n", + "parents": ["a6a69ec63e0b9f2742d9b39534e2dfc02b6a0814"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7cc33fcf7ea7c8568f676eed6007c7749bf260f1", + "subject": "fix(server): preserve cleanup failure diagnostics", + "body": "fix(server): preserve cleanup failure diagnostics\n", + "parents": ["8aa6df2d86fe3deb295227a4d482da1bc819e53e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5d30f82417b3c448232570e78312faeb48a8b9dc", + "subject": "fix(artifacts): validate directory source spelling", + "body": "fix(artifacts): validate directory source spelling\n", + "parents": ["7cc33fcf7ea7c8568f676eed6007c7749bf260f1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0eff039d0849951e82b006c719dcfb166b77237a", + "subject": "fix(mcp): preserve Android cleanup failures", + "body": "fix(mcp): preserve Android cleanup failures\n", + "parents": ["5d30f82417b3c448232570e78312faeb48a8b9dc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7557e39dcda0b957327152d8be4f90b8c8d1c03d", + "subject": "fix(providers): preserve cleanup retry diagnostics", + "body": "fix(providers): preserve cleanup retry diagnostics\n", + "parents": ["0eff039d0849951e82b006c719dcfb166b77237a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f89b03e738fe94f2bea6927c84e05871293707ea", + "subject": "fix(gdb): retain rejected shutdowns for retry", + "body": "fix(gdb): retain rejected shutdowns for retry\n", + "parents": ["7557e39dcda0b957327152d8be4f90b8c8d1c03d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0793b6c3ca7ae329fe4e024b20d2da916deae6bf", + "subject": "fix(rizin): retain rejected debugger shutdowns", + "body": "fix(rizin): retain rejected debugger shutdowns\n", + "parents": ["f89b03e738fe94f2bea6927c84e05871293707ea"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3e8923c6ebe7af9c598210c969bfee74530e76a3", + "subject": "fix(evidence): share queued cancellation handling", + "body": "fix(evidence): share queued cancellation handling\n", + "parents": ["0793b6c3ca7ae329fe4e024b20d2da916deae6bf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2f27d3ac922e8782703a2cd87a246322de7d4fc1", + "subject": "fix(evidence): separate source and presentation identity", + "body": "fix(evidence): separate source and presentation identity\n", + "parents": ["3e8923c6ebe7af9c598210c969bfee74530e76a3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "47a8000cce89303d174288e74a2e6c1569f5c3de", + "subject": "fix(cli): project nested array slices", + "body": "fix(cli): project nested array slices\n", + "parents": ["2f27d3ac922e8782703a2cd87a246322de7d4fc1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6de60993b861266e63a4e70d5c6d9a8073f7cd92", + "subject": "fix(adb): retain output on command failures", + "body": "fix(adb): retain output on command failures\n", + "parents": ["47a8000cce89303d174288e74a2e6c1569f5c3de"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5f9f13d77b395aa4e405dba3a0ef3412d9b89188", + "subject": "fix(evidence): preserve view identity and cancellation outcomes", + "body": "fix(evidence): preserve view identity and cancellation outcomes\n", + "parents": ["6de60993b861266e63a4e70d5c6d9a8073f7cd92"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "effb7960275717fd5dc2c616d9f9ca23f101a678", + "subject": "fix(evidence): validate retained views by semantic identity", + "body": "fix(evidence): validate retained views by semantic identity\n", + "parents": ["5f9f13d77b395aa4e405dba3a0ef3412d9b89188"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e334a13c79186d184f515634687d5059009ea326", + "subject": "fix(cli): merge mixed array filter selections", + "body": "fix(cli): merge mixed array filter selections\n", + "parents": ["effb7960275717fd5dc2c616d9f9ca23f101a678"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1cd82597da9711454415f2702c7e44ea153c4438", + "subject": "fix(browser): normalize discovery wire facts at the shared boundary (#7204)", + "body": "fix(browser): normalize discovery wire facts at the shared boundary (#7204)\n\nNormalize transport-specific discovery facts at their shared owner; preserve upstream duplicate-ID rejection and correct discovery-time attachment uncertainty in all consumers.\n\n53 focused regressions, serial static checks and real Chrome CLI/MCP fault injection/inspection pass. Greptile final head 5/5. Exact-main controls reproduce all 17 source and 21 shard-8 failures; seven shards cancelled and remain unverified. Requester authorized readiness and unrelated-main CI bypass. Human review is not attested.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["e334a13c79186d184f515634687d5059009ea326"], + "authors": [ + { + "name": "Rudy Mizrahi Celekli", + "email": "47457359+rudycelekli@users.noreply.github.com", + "user": { + "login": "rudycelekli", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7204] + }, + { + "sha": "14dd07e740a67b3e60fa1cdcd5cd4a2f19641eaf", + "subject": "fix(exports): preserve ELF name byte identity", + "body": "fix(exports): preserve ELF name byte identity\n", + "parents": ["1cd82597da9711454415f2702c7e44ea153c4438"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ff6b3fb9a131675d06d1fc589b50331cd3cd9629", + "subject": "fix(evidence): admit rebound APK and WASM views", + "body": "fix(evidence): admit rebound APK and WASM views\n", + "parents": ["14dd07e740a67b3e60fa1cdcd5cd4a2f19641eaf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2e7a206b20f8788bd458271b5bbc295803ca7280", + "subject": "fix(process): preserve symlink target bytes", + "body": "fix(process): preserve symlink target bytes\n", + "parents": ["ff6b3fb9a131675d06d1fc589b50331cd3cd9629"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c4242cb85eb5d8f7d6230ebedf162def6feb3717", + "subject": "fix(evidence): own standalone command finalization", + "body": "fix(evidence): own standalone command finalization\n", + "parents": ["2e7a206b20f8788bd458271b5bbc295803ca7280"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ad1a57b65d3133c111c6c95e03c979afb8f961b7", + "subject": "fix(native): own Objective-C category identity", + "body": "fix(native): own Objective-C category identity\n", + "parents": ["c4242cb85eb5d8f7d6230ebedf162def6feb3717"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f5edef3c963294245c5334abb9e57cdbea312295", + "subject": "fix(hopper): share cancellable probe output waits", + "body": "fix(hopper): share cancellable probe output waits\n", + "parents": ["ad1a57b65d3133c111c6c95e03c979afb8f961b7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "21f12b896e5968c201dcf437cbc42534ba29a075", + "subject": "fix(native): order Objective-C category records", + "body": "fix(native): order Objective-C category records\n", + "parents": ["f5edef3c963294245c5334abb9e57cdbea312295"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "dd9f5cdc4d9751b05071ae9753c85f505825c374", + "subject": "refactor(providers): share client close options", + "body": "refactor(providers): share client close options\n", + "parents": ["21f12b896e5968c201dcf437cbc42534ba29a075"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "dcfb61826d8169aa2426df984c59c7a36b982c9b", + "subject": "fix(native): share Swift symbol recognition", + "body": "fix(native): share Swift symbol recognition\n", + "parents": ["dd9f5cdc4d9751b05071ae9753c85f505825c374"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7cbf375d013d7a249a883ff2d0ff140fbb12c133", + "subject": "fix(evidence): retain authenticated parents on cancellation", + "body": "fix(evidence): retain authenticated parents on cancellation\n", + "parents": ["dcfb61826d8169aa2426df984c59c7a36b982c9b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "dd2cbbf1a27a021f0eacb2250a3f53ba1d58c5ca", + "subject": "fix(il2cpp): require FAT container identity", + "body": "fix(il2cpp): require FAT container identity\n", + "parents": ["7cbf375d013d7a249a883ff2d0ff140fbb12c133"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b9e5a9f4635e339e90b948d4f94f75be2eaa57cb", + "subject": "fix(process): retain unrepresentable filename evidence", + "body": "fix(process): retain unrepresentable filename evidence\n", + "parents": ["dd2cbbf1a27a021f0eacb2250a3f53ba1d58c5ca"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3d311d9eca00eecf51f4c4c869c5e7607c332f26", + "subject": "fix(cli): report failed browser cleanup retries", + "body": "fix(cli): report failed browser cleanup retries\n", + "parents": ["b9e5a9f4635e339e90b948d4f94f75be2eaa57cb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7e8f7f6101593cc88cfc63795b47f21c742bee87", + "subject": "feat(android): expose selected manifest component declarations (#7379)", + "body": "feat(android): expose selected manifest component declarations (#7379)\n\nExtend static manifest declarations and retain precise source locations and historical unknowns. Share bounded selected component views across CLI and MCP with complete parent Evidence.\n\nVerified real ApiDemos, an AAPT2-built fixture, legacy Evidence, default-package metadata and relevant CLI/MCP contracts. Recorded whole-task token estimates, timing/resource limits and independent main-failure controls in the PR.\n\nCo-authored-by: Harsh ", + "parents": ["3d311d9eca00eecf51f4c4c869c5e7607c332f26"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "Harsh", + "email": "johiyaharsh@gmail.com", + "user": { + "login": "harshjohiya", + "__typename": "User" + } + } + ], + "pullRequests": [7379] + }, + { + "sha": "279fc0409563a95386798991d984003e09161c4d", + "subject": "fix(snapshot): retain publication receipt on cleanup failure", + "body": "fix(snapshot): retain publication receipt on cleanup failure\n", + "parents": ["7e8f7f6101593cc88cfc63795b47f21c742bee87"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "44310bba32b02b7d88d3721341bcc88c27282d88", + "subject": "fix(il2cpp): validate selected FAT slice identity", + "body": "fix(il2cpp): validate selected FAT slice identity\n", + "parents": ["279fc0409563a95386798991d984003e09161c4d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "39c7f7e3592a09b7dc2e854a77c97ffd85011d58", + "subject": "fix(evidence): retain malformed function observations", + "body": "fix(evidence): retain malformed function observations\n", + "parents": ["44310bba32b02b7d88d3721341bcc88c27282d88"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "397a5599e364b99a66dbd5a8fd9a46011f656eb8", + "subject": "refactor(asar): retain admitted archive extents", + "body": "refactor(asar): retain admitted archive extents\n", + "parents": ["39c7f7e3592a09b7dc2e854a77c97ffd85011d58"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a49a3553f4b449a3d5048e5974226a422ab13e5a", + "subject": "refactor(managed): consolidate member comparison keys", + "body": "refactor(managed): consolidate member comparison keys\n", + "parents": ["397a5599e364b99a66dbd5a8fd9a46011f656eb8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "9e4cf28cefaddac5a548ce79211b6b0787614442", + "subject": "refactor(cli): remove obsolete JSON read error mode", + "body": "refactor(cli): remove obsolete JSON read error mode\n", + "parents": ["a49a3553f4b449a3d5048e5974226a422ab13e5a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e152349c5d3fbea1247502240ea597d0793f97db", + "subject": "fix(process): distinguish omitted byte filenames", + "body": "fix(process): distinguish omitted byte filenames\n", + "parents": ["9e4cf28cefaddac5a548ce79211b6b0787614442"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "25375924f70ad3b05526c3e991b0d51d939a86f7", + "subject": "fix(pcap): attribute DNS addresses by record owner", + "body": "fix(pcap): attribute DNS addresses by record owner\n", + "parents": ["e152349c5d3fbea1247502240ea597d0793f97db"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "921225d4b2b83bb8331e4b41aa1a7bafd9f3fbcf", + "subject": "fix(apk): match signer serials by signed integer identity (#7205)", + "body": "fix(apk): match signer serials by signed integer identity (#7205)\n\nMatch v1 APK certificate and signer serials by signed integer value. Normalize each comparison identity once and preserve raw certificate bytes and Evidence.\n\n37 source/integration tests, 23 real Android SDK verifier cases, SDK-valid padded APK CLI/MCP oracle and serial static checks passed. Hosted real-apk-signature passed. CI27pass7fail2skip7cancel; exact-main controls reproduce17source and14targeted existing-main assertions. NativeWindows/Mac/Node22 baseline gaps and canceled shards are documented. Greptile sole finding is unchanged upstream browser privacy code, scoped and resolved without a fix claim. Requester authorized readiness and unrelated-main failure bypass; no human review is attested.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["25375924f70ad3b05526c3e991b0d51d939a86f7"], + "authors": [ + { + "name": "Rudy Mizrahi Celekli", + "email": "47457359+rudycelekli@users.noreply.github.com", + "user": { + "login": "rudycelekli", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7205] + }, + { + "sha": "3e590e5b2ff21510fb143d1334cad8f9caa85d9f", + "subject": "fix(evidence): retain malformed native observations", + "body": "fix(evidence): retain malformed native observations\n", + "parents": ["921225d4b2b83bb8331e4b41aa1a7bafd9f3fbcf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "160648cc60e5550e2faf410f5f5bd693fe8a8afc", + "subject": "fix(filesystem): unify stable file identity checks", + "body": "fix(filesystem): unify stable file identity checks\n", + "parents": ["3e590e5b2ff21510fb143d1334cad8f9caa85d9f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7968ceb4508cd5be55c21c86e8da5338ba655659", + "subject": "fix(process): normalize capture environment overrides", + "body": "fix(process): normalize capture environment overrides\n", + "parents": ["160648cc60e5550e2faf410f5f5bd693fe8a8afc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "178ab2629048c6860ac7adbcc512c442a11a1406", + "subject": "fix(pcap): account for SRV owner fields", + "body": "fix(pcap): account for SRV owner fields\n", + "parents": ["7968ceb4508cd5be55c21c86e8da5338ba655659"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8f894546c87e49ddfca79bdef23a8846d0496c6b", + "subject": "fix(browser): retain evidence across cleanup errors", + "body": "fix(browser): retain evidence across cleanup errors\n", + "parents": ["178ab2629048c6860ac7adbcc512c442a11a1406"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "21b6ea7fbdc441d391dfa0b83fb69ee0b21ade38", + "subject": "refactor(ida): consolidate pagination progress checks", + "body": "refactor(ida): consolidate pagination progress checks\n", + "parents": ["8f894546c87e49ddfca79bdef23a8846d0496c6b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1dc33c05435bcb1627d6d01680f4e9c3c1af1867", + "subject": "fix(native): reuse PE header layout evidence", + "body": "fix(native): reuse PE header layout evidence\n", + "parents": ["21b6ea7fbdc441d391dfa0b83fb69ee0b21ade38"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8691e48e67ca6efd096d48dcecbbb04dbeb00467", + "subject": "refactor(evidence): return import counts from ledger owner", + "body": "refactor(evidence): return import counts from ledger owner\n", + "parents": ["1dc33c05435bcb1627d6d01680f4e9c3c1af1867"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4572f31589b6e6a7d4e318c36fafe95374a5a5b2", + "subject": "fix(pcap): preserve DNS class when attributing answers", + "body": "fix(pcap): preserve DNS class when attributing answers\n", + "parents": ["8691e48e67ca6efd096d48dcecbbb04dbeb00467"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c66729eca902a21dd70f50ce107fec7598be0f31", + "subject": "fix(workers): retain cancellation through final cleanup", + "body": "fix(workers): retain cancellation through final cleanup\n", + "parents": ["4572f31589b6e6a7d4e318c36fafe95374a5a5b2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4b6fd031467d7560e0311b29f94ab97e9869fd08", + "subject": "refactor(evidence): consolidate import staging", + "body": "refactor(evidence): consolidate import staging\n", + "parents": ["c66729eca902a21dd70f50ce107fec7598be0f31"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0a9d92a54bfa8f13eeed76d3296b0a9bf3c0608b", + "subject": "fix(browser): share admitted accessibility identities", + "body": "fix(browser): share admitted accessibility identities\n", + "parents": ["4b6fd031467d7560e0311b29f94ab97e9869fd08"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8d747c2acde4203226042c5e38a68f45115ef315", + "subject": "fix(macho): unify segment mapping admission", + "body": "fix(macho): unify segment mapping admission\n", + "parents": ["0a9d92a54bfa8f13eeed76d3296b0a9bf3c0608b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8a8331b0828aca83968a5127ecea8cbe730b7598", + "subject": "fix(setup): preserve Hermes home traversal", + "body": "fix(setup): preserve Hermes home traversal\n", + "parents": ["8d747c2acde4203226042c5e38a68f45115ef315"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "df8c90df8f57d2903515c1ea023d78fd2489ec7e", + "subject": "fix(browser): retain cancellation after failed worker stop", + "body": "fix(browser): retain cancellation after failed worker stop\n", + "parents": ["8a8331b0828aca83968a5127ecea8cbe730b7598"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c7afedc3d2c35eaefa28e1db6ffacfe6967f73df", + "subject": "refactor(macho): consolidate universal image selection", + "body": "refactor(macho): consolidate universal image selection\n", + "parents": ["df8c90df8f57d2903515c1ea023d78fd2489ec7e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "65aeb8022281b6cbfc43b5c929c6664f33ac3da7", + "subject": "refactor(providers): share artifact cleanup binding", + "body": "refactor(providers): share artifact cleanup binding\n", + "parents": ["c7afedc3d2c35eaefa28e1db6ffacfe6967f73df"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b61fe25068053cedefd396d61e34eea828c148c0", + "subject": "refactor(electron): reuse source range identities", + "body": "refactor(electron): reuse source range identities\n", + "parents": ["65aeb8022281b6cbfc43b5c929c6664f33ac3da7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "ddb533767458400e66cb7165b082fad2d7ad3b57", + "subject": "fix(setup): resolve Hermes home ancestors before profile selection", + "body": "fix(setup): resolve Hermes home ancestors before profile selection\n", + "parents": ["b61fe25068053cedefd396d61e34eea828c148c0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "47f8669c1e63f17b5697f4eaf9899973112e9e79", + "subject": "fix(export): retain publication and cleanup failures", + "body": "fix(export): retain publication and cleanup failures\n", + "parents": ["ddb533767458400e66cb7165b082fad2d7ad3b57"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "82f50f56db1db65030add9b9468373ce57dba8df", + "subject": "fix(macho): validate slice overlap at shared reader", + "body": "fix(macho): validate slice overlap at shared reader\n", + "parents": ["47f8669c1e63f17b5697f4eaf9899973112e9e79"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5aa23c3d17456e331d6df2866490b81577e04e32", + "subject": "refactor(providers): move inspection scope to application", + "body": "refactor(providers): move inspection scope to application\n", + "parents": ["82f50f56db1db65030add9b9468373ce57dba8df"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "98e47e37a2c657342196313b0381157f01b38771", + "subject": "refactor(pcap): centralize DNS packet facts", + "body": "refactor(pcap): centralize DNS packet facts\n", + "parents": ["5aa23c3d17456e331d6df2866490b81577e04e32"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "21483a1a4741c54039a969d934daeaaaece62d53", + "subject": "refactor(artifacts): reuse descriptor range reader", + "body": "refactor(artifacts): reuse descriptor range reader\n", + "parents": ["98e47e37a2c657342196313b0381157f01b38771"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "235e8bc056816c7e91120f857ed0b8749b9253de", + "subject": "refactor(evidence): centralize provider identity comparison", + "body": "refactor(evidence): centralize provider identity comparison\n", + "parents": ["21483a1a4741c54039a969d934daeaaaece62d53"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "01a725ecfa901e6eeeb6cecc6ef7316a82ac257c", + "subject": "fix(setup): preserve configuration directory requirements", + "body": "fix(setup): preserve configuration directory requirements\n", + "parents": ["235e8bc056816c7e91120f857ed0b8749b9253de"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5b292b630e5425b263c51bbcc4a43284701f708f", + "subject": "fix(export): report publication cleanup failures to callers", + "body": "fix(export): report publication cleanup failures to callers\n", + "parents": ["01a725ecfa901e6eeeb6cecc6ef7316a82ac257c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c29a93097a13a4aa969cde016f6bfeac2f50756e", + "subject": "fix(pcap): preserve metadata on duration overflow", + "body": "fix(pcap): preserve metadata on duration overflow\n", + "parents": ["5b292b630e5425b263c51bbcc4a43284701f708f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1ea69035959fe86dfab921ff66a2ddcd4471a03f", + "subject": "fix(ida): preserve path identity across symlink traversal", + "body": "fix(ida): preserve path identity across symlink traversal\n", + "parents": ["c29a93097a13a4aa969cde016f6bfeac2f50756e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6ed97a22ed37feb414ebbfa683e53250d052e342", + "subject": "fix(export): retain verification cleanup failures", + "body": "fix(export): retain verification cleanup failures\n", + "parents": ["1ea69035959fe86dfab921ff66a2ddcd4471a03f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a37dbb953c630d07c5fa5ed4f0a6c21c7d04df67", + "subject": "refactor(artifacts): select extraction reader from inventory", + "body": "refactor(artifacts): select extraction reader from inventory\n", + "parents": ["6ed97a22ed37feb414ebbfa683e53250d052e342"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6d14e25345bd58dc70d0eeca51313e763db9aa6e", + "subject": "refactor(ida): centralize capability admission", + "body": "refactor(ida): centralize capability admission\n", + "parents": ["a37dbb953c630d07c5fa5ed4f0a6c21c7d04df67"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4e67bc399951768737eeaf539f7bc9fa8373b244", + "subject": "refactor(analysis): consolidate selection ownership", + "body": "refactor(analysis): consolidate selection ownership\n", + "parents": ["6d14e25345bd58dc70d0eeca51313e763db9aa6e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f59fc19d2170c9fc1800cdd5ed9954731167840b", + "subject": "fix(managed): unify native module identity matching", + "body": "fix(managed): unify native module identity matching\n", + "parents": ["4e67bc399951768737eeaf539f7bc9fa8373b244"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7d6bccb86d1bc8674ee9e1cb3c05960487143732", + "subject": "fix(harmony): classify exact manifest names once (#7206)", + "body": "fix(harmony): classify exact manifest names once (#7206)\n\nUse one exact-case manifest path classifier for Harmony model hints and components. Preserve unavailable content identity, resource exclusions, Stage precedence and Evidence provenance.\n\n33 boundary tests, docs checks, serial static checks and real pinned-HAP CLI/MCP before/after task passed. Canonical complete projection Evidence stays identical; uppercase derivative now reports unknown/no manifests. Shipped verifier source-ID assertion reproduces on unchanged main. CI7pass4fail19skip7cancel; exactmain reproduces17source and20shard8 failures. Greptile4/5soleupstreamfile-readercleanup scoped/resolvednotfixed. Requester authorized readiness and unrelated-main bypass; human review is not attested.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["f59fc19d2170c9fc1800cdd5ed9954731167840b"], + "authors": [ + { + "name": "Rudy Mizrahi Celekli", + "email": "47457359+rudycelekli@users.noreply.github.com", + "user": { + "login": "rudycelekli", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7206] + }, + { + "sha": "c9df40f8104eb0c7dfb57dc831b4c28c3ab77b8b", + "subject": "refactor(verification): own browser fixture lifecycle", + "body": "refactor(verification): own browser fixture lifecycle\n", + "parents": ["7d6bccb86d1bc8674ee9e1cb3c05960487143732"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "2733979b4d099aef44e76bca4e869b46d4858948", + "subject": "fix(analysis): validate native UI seed addresses", + "body": "fix(analysis): validate native UI seed addresses\n", + "parents": ["c9df40f8104eb0c7dfb57dc831b4c28c3ab77b8b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d3af70fa27d8fcb256e94efee6f528aa61ca0de0", + "subject": "fix(ida): preserve startup failure ownership", + "body": "fix(ida): preserve startup failure ownership\n", + "parents": ["2733979b4d099aef44e76bca4e869b46d4858948"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4055cc4df15688682d7315340c3b3a66d369540d", + "subject": "fix(verification): retain browser profile until shutdown", + "body": "fix(verification): retain browser profile until shutdown\n", + "parents": ["d3af70fa27d8fcb256e94efee6f528aa61ca0de0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "4726b19f98fbec5ea9a4ac2b9879dd37e5d8d14b", + "subject": "fix(reference): retain ambiguous source identities", + "body": "fix(reference): retain ambiguous source identities\n", + "parents": ["4055cc4df15688682d7315340c3b3a66d369540d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "cce244f03761227bc1497264c5df43582818bcc3", + "subject": "fix(providers): reject invalid parsed MCP JSON", + "body": "fix(providers): reject invalid parsed MCP JSON\n", + "parents": ["4726b19f98fbec5ea9a4ac2b9879dd37e5d8d14b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "df0e2f7b3e9f3af0ae0f9065936a341b37c6ec98", + "subject": "fix(desktop): read bounded MZ signature evidence", + "body": "fix(desktop): read bounded MZ signature evidence\n", + "parents": ["cce244f03761227bc1497264c5df43582818bcc3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6941d5ab92059299761e7508e83aba28aa4123f6", + "subject": "fix(native): classify legacy MZ signatures before COFF", + "body": "fix(native): classify legacy MZ signatures before COFF\n", + "parents": ["df0e2f7b3e9f3af0ae0f9065936a341b37c6ec98"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "abfc42cfb1f014068dc853112e24b9982abc38ec", + "subject": "fix(wasm): distinguish source and internal failures", + "body": "fix(wasm): distinguish source and internal failures\n", + "parents": ["6941d5ab92059299761e7508e83aba28aa4123f6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a2e2c29b59e8775b0e6aedb09a9eb16adf32646b", + "subject": "refactor(analysis): move client cleanup to application", + "body": "refactor(analysis): move client cleanup to application\n", + "parents": ["abfc42cfb1f014068dc853112e24b9982abc38ec"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "59dc48db20fa8cdf9c5468afbe658d86323b3134", + "subject": "fix(pcap): attribute DNS answers using wire identities", + "body": "fix(pcap): attribute DNS answers using wire identities\n", + "parents": ["a2e2c29b59e8775b0e6aedb09a9eb16adf32646b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "50822e1eff99136c5e5f7b1b1d3351c898937983", + "subject": "fix(evidence): include every subject format in bundles", + "body": "fix(evidence): include every subject format in bundles\n", + "parents": ["59dc48db20fa8cdf9c5468afbe658d86323b3134"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "1fe92bff8ea1c230086c967268f71dd96dc2d7b2", + "subject": "fix(pe): bound forwarders to export directory", + "body": "fix(pe): bound forwarders to export directory\n", + "parents": ["50822e1eff99136c5e5f7b1b1d3351c898937983"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d14f199736dbdc2b7cbb7dcb1318acddfd3e5b3d", + "subject": "fix(debugger): retain verified detach across cleanup retries", + "body": "fix(debugger): retain verified detach across cleanup retries\n", + "parents": ["1fe92bff8ea1c230086c967268f71dd96dc2d7b2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c602fe88281be334a0db83067b90be43551e3c7f", + "subject": "refactor(schemas): select native and GPU variants by name", + "body": "refactor(schemas): select native and GPU variants by name\n", + "parents": ["d14f199736dbdc2b7cbb7dcb1318acddfd3e5b3d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "5b14823353d9ad39ecdc857ae5ba8026dd975825", + "subject": "fix(gdb): retain confirmed detach during close", + "body": "fix(gdb): retain confirmed detach during close\n", + "parents": ["c602fe88281be334a0db83067b90be43551e3c7f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "365fb03e73ffb23f4394b7fb82776f7dd2045301", + "subject": "chore: archive analysis efficiency experiments", + "body": "chore: archive analysis efficiency experiments\n", + "parents": ["5b14823353d9ad39ecdc857ae5ba8026dd975825"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e99b6c2c3bcc5f4f050b51b432145144d0d47dc0", + "subject": "fix(dotnet): retain malformed method body diagnostics", + "body": "fix(dotnet): retain malformed method body diagnostics\n", + "parents": ["365fb03e73ffb23f4394b7fb82776f7dd2045301"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "dfe6aaf6dafc34d4132508285b6e166cf95cfa33", + "subject": "fix(gpu): preserve omitted metadata in projected views", + "body": "fix(gpu): preserve omitted metadata in projected views\n", + "parents": ["e99b6c2c3bcc5f4f050b51b432145144d0d47dc0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "0676ad254c206871e0f4b120ba300cbbf9383b62", + "subject": "docs(clients): note Droid's FACTORY_HOME_OVERRIDE (#7382)", + "body": "docs(clients): note Droid's FACTORY_HOME_OVERRIDE (#7382)\n\n768b58c6d (fix(setup): honor Droid home override) made factoryDirectory\nresolve from FACTORY_HOME_OVERRIDE, so setup now writes the registration\nand the personal skill copy under that home instead of ~/.factory. The\nFactory Droid section still described only ~/.factory, and the page names\nevery other client's home override (KIMI_CODE_HOME, QODER_CONFIG_DIR,\nQWEN_HOME, HERMES_HOME, CODEX_HOME, GEMINI_CLI_HOME, PI_CONFIG_DIR, DSH_HOME),\nso Droid was the only one missing.", + "parents": ["dfe6aaf6dafc34d4132508285b6e166cf95cfa33"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [7382] + }, + { + "sha": "2817d30ab2fc41ae08a7c5f49a6647b2eda39d64", + "subject": "fix(docs): preserve verification reports after experiment archival (#7462)", + "body": "fix(docs): preserve verification reports after experiment archival (#7462)\n\nMove the retained allocation report and unchanged receipt JSON into verification documentation. Keep one report producer, repair current and archived links, document test-support ownership, and remove retired lint inputs.\n\nFixes #7458.\n\nValidated focused/Python checks, report consistency, docs rendering, and real Bash CLI/MCP facts against an independent oracle. Greptile reviewed all seven files without comments. CI source/Windows/shard-8 failures match clean-main or existing-main controls; the requester authorized merging with those established failures. Codex review quota was unavailable.", + "parents": ["0676ad254c206871e0f4b120ba300cbbf9383b62"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7462] + }, + { + "sha": "98422997c035bf314084b7d786628616e70bc95f", + "subject": "fix(setup): report Kuna cache aliases consistently (#7207)", + "body": "fix(setup): report Kuna cache aliases consistently (#7207)\n\nfix(setup): report Kuna cache aliases consistently (#7207)\n\nUnify lexical default-cache reports without changing removal authority. Plan selections before deleting managed directories; resolve absolute POSIX paths independently of ambient cwd. Preserve parent traversal, literal backslashes, caller data, and result/removal order.\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["2817d30ab2fc41ae08a7c5f49a6647b2eda39d64"], + "authors": [ + { + "name": "Rudy Mizrahi Celekli", + "email": "47457359+rudycelekli@users.noreply.github.com", + "user": { + "login": "rudycelekli", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7207] + }, + { + "sha": "03f17cf41d3c844f9383d7792d9b1a14330d0bb2", + "subject": "feat(android): apply caller-selected R8 mapping evidence (#7456)", + "body": "feat(android): apply caller-selected R8 mapping evidence (#7456)\n\nApply caller-selected R8/ProGuard mappings to shared Android inspections, preserving raw identities, exact verification, ambiguity and provenance. Add retained summaries and bounded/cached parsing, with measured real R8/Conscrypt workflows and review fixes.\n\nFixes #6329.\n\nCo-authored-by: 555aaditya <107977627+555aaditya@users.noreply.github.com>", + "parents": ["98422997c035bf314084b7d786628616e70bc95f"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "555aaditya", + "email": "107977627+555aaditya@users.noreply.github.com", + "user": { + "login": "555aaditya", + "__typename": "User" + } + } + ], + "pullRequests": [7456] + }, + { + "sha": "b8cdbdf0ef2c479919cfed2c217b5710c2c294db", + "subject": "test(sqlite): gate projection checks on native limits", + "body": "test(sqlite): gate projection checks on native limits\n", + "parents": ["03f17cf41d3c844f9383d7792d9b1a14330d0bb2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d6f88becd531cabafca1d968b89cf7fc77a80041", + "subject": "fix(mcp): summarize copied browser observations in input declarations (#7469)", + "body": "fix(mcp): summarize copied browser observations in input declarations (#7469)\n\nDeclare copied complete browser observations as abbreviated object operands, keeping canonical validation and normalization controls unchanged. Preserve all other tool declarations and Evidence identities.\n\nRefs #4973 and #4081.", + "parents": ["b8cdbdf0ef2c479919cfed2c217b5710c2c294db"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7469] + }, + { + "sha": "740c0f5615391c888a377981292f6c88fc7f439d", + "subject": "fix(windows): restore native verification fixture coverage (#7479)", + "body": "fix(windows): restore native verification fixture coverage (#7479)\n\nRestore independent PE fixtures and dependency-complete standalone artifact verifier tests. Execute existing real Windows native behavior and inspection recovery proofs before unrelated curated tests.\n\nValidation: 101 focused tests; full typecheck; scoped lint, module/discovery/format/docs checks; valid/corrupt real-image verifier controls; real Windows artifact, behavior, and inspection recovery proof steps passed. Greptile found no actionable issues. Codex review quota exhausted.\n\nCI remains red from exact-base failures: Source 9, Windows 7 (base 15; loader 8 repaired), and built shard 4's 7 matching failures; 7 other shards cancelled by fail-fast. Later Windows package/Node 22/24 checks skipped. User explicitly authorized bypass of established main failures. No claim of complete CI or unavailable coverage.\n\nFixes #7474.", + "parents": ["d6f88becd531cabafca1d968b89cf7fc77a80041"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7479] + }, + { + "sha": "570abe95f2a35b5c580a5ec2fca90c33d4114bdc", + "subject": "feat(android): link native declarations to static JNI candidates (#7472)", + "body": "feat(android): link native declarations to static JNI candidates (#7472)\n\nLink original DEX native declarations to per-ABI function exports and relocated static JNI table candidates through shared CLI/MCP workflows. Preserve global attribution ambiguity, exact provenance, partial coverage and retained Evidence; default MCP delivery to bounded summaries with filtered/batch pages.\n\nUse one immutable ELF relocation decoder with streaming IL2CPP materialization, cooperative bounded export/version parsing and bounded JNI state. Reuse validated session inventories without loading target libraries or executing JNI code.\n\nValidation: relevant type/lint/build and parser/domain/public CLI/MCP regressions; genuine four-ABI NDK fixtures and independent library/slot oracles; actual JDK/JADX Conscrypt workflows with retained-source removal. Full measurements and limitations are recorded in docs/verification/android-jni-bindings-2026-10-27.md.\n\nCloses #6403.", + "parents": ["740c0f5615391c888a377981292f6c88fc7f439d"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7472] + }, + { + "sha": "1201c25542bc1e6233265fb220b334f81886550c", + "subject": "fix(ci): align static checks and regression fixtures with current contracts (#7349)", + "body": "fix(ci): align static checks and regression fixtures with current contracts (#7349)\n\n* fix(ci): retire unused internal analysis declarations\n\n* test: use an admitted app bundle for provider routing\n\n(cherry picked from commit 00aa17f12a1f9db0205fe82104d14e93bec63bdd)\n\n* test: keep bundle routing coverage outside oversized group\n\n(cherry picked from commit 8658353b0d0bce41c9f2501e048622b98775b641)\n\n* fix(ci): align regression fixtures with current admission contracts\n\n* test: bind extraction close fixtures to their ZIP digest\n\n(cherry picked from commit 626d0250dbfe07fc55fe17686b0bc437c510b32b)\n\n* test(cli): match typed analysis outcomes in function detail fixture\n\n* test(ghidra): preserve empty Java property separator framing\n\n* test(electron): retain unknown IPC ownership for native module gaps\n\n* fix(electron): share source-scoped call path identity\n\n* test(captures): assert safe source identity on SAZ refusal\n\n* test(apple): match root occurrence kind to inventory manifest\n\n* fix(examples): align directory root occurrence identity\n\n* test(electron): align equivalent fixture assertions with upstream\n\n* test(process): assert retained capture root identity\n\n* test(windows): declare the PE fixture optional header\n\n* test(ci): refresh owned registration and verifier fixtures\n\n* test(setup): use owned registrations for refresh fixtures\n\n* test(process): control unavailable ownership in CLI cleanup fixture\n\n* test(process): guard controlled compiler output arguments\n\n* test(setup): align equivalent entrypoint guards with upstream\n\n* test(process): release the cleanup target through an owned gate\n\n* test(ci): align semantic identities and owned fixture facts\n\n* test(pcap): retain the upstream DNS wire fixture branch\n\n* test(pcap): use the canonical wire ownership fixture\n\n* test(pcap): assert exact DNS wire query labels\n\n* test(ci): preserve admission and ownership fixture prerequisites\n\n* test(ci): align authenticated fixture and cleanup boundaries\n\n* test(windows): align native artifact fixtures with upstream\n\n* test(android): request complete evidence for inline MCP contracts\n\n* test: avoid pinning diagnostic wording\n\n* test: verify cleanup diagnostics at their source\n\n* test: strengthen evidence and cleanup checks\n\n* test: avoid pinning registration guidance\n\n---------\n\nCo-authored-by: Plastic-time \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["570abe95f2a35b5c580a5ec2fca90c33d4114bdc"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + }, + { + "name": "Plastic-time", + "email": "Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7349] + }, + { + "sha": "ec3f84b6266846f938b0dc400f4fa7e5841e7260", + "subject": "test(ci): avoid pinning skip warning wording", + "body": "test(ci): avoid pinning skip warning wording\n", + "parents": ["1201c25542bc1e6233265fb220b334f81886550c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "b4118b9683378ceb3bfb696c61c3d49da0be08e8", + "subject": "docs(hermes): explain nested-home routing and preview limits (#4145)", + "body": "docs(hermes): explain nested-home routing and preview limits (#4145)\n\n* docs(hermes): clarify sticky profiles for nested homes\n\n* docs(hermes): qualify nested homes beneath default symlinks\n\n* docs(hermes): cover canonicalized ancestor paths\n\n* docs(hermes): clarify both missing-path containment errors", + "parents": ["ec3f84b6266846f938b0dc400f4fa7e5841e7260"], + "authors": [ + { + "name": "Chip Li", + "email": "53254273+hichipli@users.noreply.github.com", + "user": { + "login": "hichipli", + "__typename": "User" + } + } + ], + "pullRequests": [4145] + }, + { + "sha": "cbeeeda97b33c1ea7e00890b17b9b5870389043f", + "subject": "fix(javascript): resolve preceding exported variable initializers and computed method keys (#5387)", + "body": "fix(javascript): resolve preceding exported variable initializers and computed method keys (#5387)\n\nfix(javascript): resolve variable initializers before computed method keys", + "parents": ["b4118b9683378ceb3bfb696c61c3d49da0be08e8"], + "authors": [ + { + "name": "Ahmed", + "email": "aptech356@gmail.com", + "user": { + "login": "ahmed-husssain", + "__typename": "User" + } + } + ], + "pullRequests": [5387] + }, + { + "sha": "d47efe1a54ada1fab1386d25ce0081edac5fe5f3", + "subject": "fix(native): reject mixed dyld refusal diagnostics (#5778)", + "body": "fix(native): reject mixed dyld refusal diagnostics (#5778)\n\n* fix(native): classify confirmed dSYM dyld refusals\n\n* style(native): format target refusal handling\n\n* fix(native): confirm precise Mach-O layout refusals before export fallback\n\n* test(cli): observe cancellation at stable source resolution boundary\n\n* fix(native): reject contradictory dyld layout refusals\n\n* fix(native): preserve mixed dyld diagnostic failures\n\n* fix(native): retain the evidence behind contradictory layout refusals\n\nWhen the imports and exports refusals disagree, or a refusal disagrees with\nthe parsed Mach-O header, inspect_macho returned a generic output error that\nkept only one dyld_info capture. It dropped the header file type and the other\nrefusal, so the failure could not show why the admitted diagnostic was\nrejected.\n\nThe contradiction now has its own error. Its diagnostics keep the parsed file\ntype and every admitted refusal (mode, admitted layout, exit code and output),\nand the captured output is still the conflicting command. The test checks the\nreason and the retained diagnostics for each contradiction case.\n\n* test(native): allow time for real Mach-O CLI and MCP controls", + "parents": ["cbeeeda97b33c1ea7e00890b17b9b5870389043f"], + "authors": [ + { + "name": "Jeff", + "email": "138259519+jdotc1@users.noreply.github.com", + "user": { + "login": "jdotc1", + "__typename": "User" + } + } + ], + "pullRequests": [5778] + }, + { + "sha": "095a51cf38d2a0dc58368f6c9482062d594f856b", + "subject": "fix(browser): reject invalid UTF-8 in HTTP CDP discovery (#4524)", + "body": "fix(browser): reject invalid UTF-8 in HTTP CDP discovery (#4524)", + "parents": ["d47efe1a54ada1fab1386d25ce0081edac5fe5f3"], + "authors": [ + { + "name": "Afloat", + "email": "132809511+Afloat16@users.noreply.github.com", + "user": { + "login": "Afloat16", + "__typename": "User" + } + } + ], + "pullRequests": [4524] + }, + { + "sha": "84f62f76e57dcfe5e058719d71f5f1196119f75d", + "subject": "fix(hermes): preserve external YAML anchor consumers (#5152)", + "body": "fix(hermes): preserve external YAML anchor consumers (#5152)\n\n* fix(hermes): preserve consumers of anchored registrations\n\nKeep original alias values and comments before setup or uninstall replaces an anchored REA node. Preserve original nested bindings and retained sharing through the common YAML writer.\n\nFixes #3325\n\n* test(hermes): assert retained alias object identity\n\n* fix(hermes): preserve removed keys and surviving alias owners\n\n* test(cli): restore retained-view cancellation phase coverage\n\n* fix(setup): retain copied Hermes anchor comments\n\n* chore(hermes): reverse incidental merge hook changes\n\nReverse the merge relative to its included-main parent to restore exact upstream bytes. Reapply only the independently reviewed shared-owner and regression patch in a normal follow-up commit. Keep all ordinary history and normal hooks; no remote push of the rejected hook drift.\n\nRefs #3325\n\n* fix(hermes): retain reviewed shared-owner integration\n\n* chore(hermes): reverse incidental merge hook changes\n\nReverse the merge relative to its included-main parent to restore exact upstream bytes. Reapply only the independently reviewed shared-owner and regression patch in a normal follow-up commit. Keep all ordinary history and normal hooks; no remote push of the rejected hook drift.\n\nRefs #3325\n\n* fix(hermes): retain exact reviewed shared-owner regression\n\n* test(native): align plist command fixtures with main\n\nAdopt the two maintained-main fixture files as of\ndd198d037fcd8e2d313dff2147d7a80c436f3e5c. Distinguish exact XML lint\nvalidation from conversion commands and retain truthful provenance,\nsource-value, format, limitations and unknown-scalar assertions.\n\nThe original seven provenance failures reproduce before this repair.\nThe affected three-file group passes all 86 checks afterward. Product\ncode and installed-package bytes remain unchanged.\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\n\n* fix(native): retain bound-target dispatch failure contracts\n\nAdopt morluto's canonical Apple dispatch metadata owner and bounded MCP\nand cleanup controls from 41e10b240cec68308456056a2b4102b72199b227.\nKeep fresh admission separate from already-bound target changes and\nretain access-denied classification, exact physical causes and cleanup\nownership. Update the two stale unit expectations exposed by Source CI.\n\nThe original unit pair reproduces before the correction. Current focused\nregressions, package verification and installed feature controls pass.\nOnly the canonical Apple owner and related controls are ported; this does\nnot integrate unrelated later-main changes or create another contribution.\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\n\n* test: align plist provenance and package listing fixtures\n\nKeep the exact XML lint invocation in CLI provenance and include the\nrequired CLI environment owner in the synthetic package member list.\nPreserve binary provenance and all LF, CRLF, literal-CR and bytecode checks.\n\n* revert(hermes): restore canonical main before reviewed replay\n\nThis reverts commit 575a10d1947cd654d7ce9dde106f7c38fa824271, reversing\nchanges made to bb17e90f27dc8908c1c91c05055679678768c266.\n\n* test(cli): retain full cancellation oracle with prepared projection\n\n---------\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["095a51cf38d2a0dc58368f6c9482062d594f856b"], + "authors": [ + { + "name": "hhang", + "email": "17309584214@163.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [5152] + }, + { + "sha": "097cd2c9881e382ed8efb98aaa5dedae7a2c13ca", + "subject": "fix(browser): report non-absolute export paths at their input field (#7097)", + "body": "fix(browser): report non-absolute export paths at their input field (#7097)", + "parents": ["84f62f76e57dcfe5e058719d71f5f1196119f75d"], + "authors": [ + { + "name": "Saiyam Jain", + "email": "62669344+saiyam-jain-dev@users.noreply.github.com", + "user": { + "login": "saiyam-jain-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7097] + }, + { + "sha": "79d2fc05405c76bc0a8f71b9c10355135da4747b", + "subject": "fix(doctor): classify an unreadable skill identity as unknown (#7090)", + "body": "fix(doctor): classify an unreadable skill identity as unknown (#7090)\n\nrea doctor reported a skill copy with an unreadable or unresolved path as identity state unknown but classified its skill:identity check as config_drift, which claims the copy has drifted. docs/installation.md keeps an unreadable skill identity unknown, and the sibling registration checks already classify unknown state as unknown. The skill check and the DoctorScope fallback now do the same.", + "parents": ["097cd2c9881e382ed8efb98aaa5dedae7a2c13ca"], + "authors": [ + { + "name": "Adolanium", + "email": "94890352+Adolanium@users.noreply.github.com", + "user": { + "login": "Adolanium", + "__typename": "User" + } + } + ], + "pullRequests": [7090] + }, + { + "sha": "b9d1a61dd5829e3f2f16be6e1ee32d9c1f57c103", + "subject": "docs(ghidra): clarify Objective-C Message Analyzer libobjc log (#7249)", + "body": "docs(ghidra): clarify Objective-C Message Analyzer libobjc log (#7249)\n\nClarify the Objective-C analyzer message, coverage limitation, structured failure diagnostics, and existing opt-out/startup resource controls.\n\nVerification: exact documentation change applied on main 79d2fc054; docs:check passed. Installed Ghidra 12.2 analyzer/scheduler and REA error/launch owners inspected. No real macOS target reproduction; original failure remains unknown. PR CI and Greptile passed; Codex review unavailable.", + "parents": ["79d2fc05405c76bc0a8f71b9c10355135da4747b"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [7249] + }, + { + "sha": "b3fd0aa3ee0997af91e18855eb8928144bdede2b", + "subject": "test(setup): align Hermes symlink preview expectations", + "body": "test(setup): align Hermes symlink preview expectations\n", + "parents": ["b9d1a61dd5829e3f2f16be6e1ee32d9c1f57c103"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "7f90549916fd424fd153aef101c53baccc42ff43", + "subject": "chore(android): remove unused type exports", + "body": "chore(android): remove unused type exports\n", + "parents": ["b3fd0aa3ee0997af91e18855eb8928144bdede2b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "a95b83c2b06ef713664d6abb3d29c7c149a2ce01", + "subject": "perf(javascript): cache callable result syntax by AST identity (#7508)", + "body": "perf(javascript): cache callable result syntax by AST identity (#7508)\n\nCache direct return/yield source expressions by immutable AST identity for all existing static and semantic consumers. Weak keys bound retention to AST lifetime; mutable analysis facts and Evidence remain unchanged. Refs #6311; full CastleIO analysis still times out.\n\nValidation: 225 focused tests; baseline cache-regression controls; build, serial check:fast and test discovery passed. CastleIO direct-syntax facts equal with 78,272 warm lookups reduced from 2.72-2.81s to 13.0-13.4ms. Complete sourcemap-codec CLI analyses retained byte-identical Evidence; no end-to-end speedup or token reduction claimed.\n\nCI: source 20,888 passed / 15 skipped; seven built-dependent shards, static, docs, package builds, Linux native baseline and real JS recovery CLI/MCP passed. Shard 6 Hermes path-preview failures both reproduce on exact main b9d1a61dd; Portable tests fails downstream. Greptile 5/5, no findings; Codex quota exhausted. Authorized admin bypass for unrelated baseline CI and unchecked human readiness; no human review attestation made.", + "parents": ["7f90549916fd424fd153aef101c53baccc42ff43"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7508] + }, + { + "sha": "313af7119cd8687bd10a468a424e243a9bc28bc2", + "subject": "fix(website): keep phone navigation labels from splitting mid-word (#7497)", + "body": "fix(website): keep phone navigation labels from splitting mid-word (#7497)\n\nThe phone header gave each link an equal minmax(0, 1fr) column and\nallowed overflow-wrap: anywhere, so single-word labels such as\n\"Showcases\", \"Anleitungen\", \"Руководства\" and \"Посібники\" broke between\nletters at 320-430px. Links now share the row as flex items that never\nshrink below their longest word. Labels wrap only at spaces, and a word\nwider than the whole row can still break, preserving the enlarged-text\nfit from #3598.\n\nRefs #3597", + "parents": ["a95b83c2b06ef713664d6abb3d29c7c149a2ce01"], + "authors": [ + { + "name": "Pirro Zani", + "email": "131965864+pirrozani@users.noreply.github.com", + "user": { + "login": "pirrozani", + "__typename": "User" + } + } + ], + "pullRequests": [7497] + }, + { + "sha": "bcc6775dc1c29c06a08798b73049d0bf506e6b55", + "subject": "fix(cli): reject non-decimal Android overload index tokens (#7493)", + "body": "fix(cli): reject non-decimal Android overload index tokens (#7493)\n\nAndroid overload selection declared a plain number, so the CLI argument\nparser coerced the raw token with Number before the schema ran. An empty\ntoken therefore arrived as 0, and hexadecimal, exponent, signed, and\nfloat spellings arrived as their numeric value, leaving both commands to\nproceed to artifact admission on a selector the caller never wrote as a\ndecimal integer.\n\nReuse the existing decimal token parser that the other integer CLI\noptions already use. Omitted and explicit decimal zero keep their current\nmeanings, and the published schema for overloadIndex is unchanged.\n\nValidation: npm run compile, the cli-boundary vitest project for\ntests/boundary/cli/cliIntegerArguments.test.ts (56 passed), npm run\ntypecheck, npm run lint, npm run lint:typed, npm run format:check, npm\nrun metadata:check, npm run verify:architecture-guards, and npm run\nknip:production. The new cases fail against the base source and pass with\nthe change.\n\nFixes #7430.\n\nCo-authored-by: S1Mon <251732998+fgfsgsgvo@users.noreply.github.com>", + "parents": ["313af7119cd8687bd10a468a424e243a9bc28bc2"], + "authors": [ + { + "name": "S1Mon", + "email": "fgfsgsgvo@gmail.com", + "user": { + "login": "fgfsgsgvo", + "__typename": "User" + } + }, + { + "name": "S1Mon", + "email": "251732998+fgfsgsgvo@users.noreply.github.com", + "user": { + "login": "fgfsgsgvo", + "__typename": "User" + } + } + ], + "pullRequests": [7493] + }, + { + "sha": "6eb37a774930b5b9edb137edd441e30652dfd394", + "subject": "fix(ci): restore qualification and reduce validation overhead", + "body": "fix(ci): restore qualification and reduce validation overhead\n\nUse one typed-checker worker by default without changing semantic scope or caller overrides. Reuse the bounded CLI worker for pure argument validation while retaining fresh-process coverage and all upstream cases.\n\nKeep registration tests independent of real package-runner downloads while asserting the actual prewarm command and startup context. Pass the advertised binary_session definition by name to package verification, retaining default SDK validation and complete catalog/contract checks while avoiding compilation of unrelated tool outputs. Preserve all four installed-tarball scenarios and existing deadlines.\n\nStrengthen Hermes preview operation/backup assertions and clarify physical-path routing documentation.\n\nAssisted-by: Suika (gensokyo-skills:suika-scatter-gather-planning)", + "parents": ["bcc6775dc1c29c06a08798b73049d0bf506e6b55"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7509] + }, + { + "sha": "65f1c447344a423fa2785847dbcea1e9a9e2454a", + "subject": "refactor: retire superseded test-only runtime entrypoints (#7515)", + "body": "refactor: retire superseded test-only runtime entrypoints (#7515)\n\nMigrate MCP session tests to the named lifecycle output schema and preserve raw reply envelopes. Move R8 type/alias checks to the production field resolver and recovery guidance checks to their scoped factory; remove superseded test-only exports and an unused import.\n\nValidation: 99 focused tests, an exact-old-schema negative control, full selected CI including all 8 shards and source tests, and Greptile source review passed. Fresh-head real stdio MCP analyzed fast-deep-equal@3.1.3 and retained a complete authenticated Evidence bundle after close; compact/full catalogs are unchanged. Full local typed lint hit the 3 GiB memory guard; scoped typed lint passed. Codex review quota exhausted.\n\nFixes #7513.", + "parents": ["6eb37a774930b5b9edb137edd441e30652dfd394"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7515] + }, + { + "sha": "269630f4e1c93e45e5d133fde370736133865a3c", + "subject": "docs: archive historical verification and release inventories (#7519)", + "body": "docs: archive historical verification and release inventories (#7519)\n\nRetire redundant historical JSON copies from the active documentation tree after verifying identical published release snapshots and an immutable route-report archive. Preserve current release data, original evidence, release publication logic and historical access.\n\nValidation: 48 release tests; documentation conformance and rendered archive link/digest; Git blob/SHA-256 checks; selected current-head CI passed. Greptile: 5/5 with no actionable findings. Codex GitHub review unavailable due quota.\n\nCloses #7517.", + "parents": ["65f1c447344a423fa2785847dbcea1e9a9e2454a"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7519] + }, + { + "sha": "0cd7ef456bf960da265e04b341e82a24b1e377d5", + "subject": "feat(plugins): make Claude Code and Codex installs self-contained (#7514)", + "body": "feat(plugins): make Claude Code and Codex installs self-contained (#7514)\n\nShip Claude Code and Codex from one release-pinned npm artifact with bundled runtime dependencies, extraction-only MCP qualification, plugin-aware recovery, and synchronized release metadata.\n\nIntegrates #2815 and the original proposal #1977. The original commits remain available on the PR branch; retain their author and assistant credit in this squash.\n\nValidation: required CI passed, real Codex/Claude loading verified, and reviewed packaging/recovery findings addressed.\n\nCo-authored-by: GamerDubz \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\nCo-authored-by: OpenAI Codex \nCo-authored-by: Claude Opus 5.5 ", + "parents": ["269630f4e1c93e45e5d133fde370736133865a3c"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "GamerDubz", + "email": "themastergamerplays24.7@gmail.com", + "user": { + "login": "GamerDubz", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "OpenAI Codex", + "email": "openai-codex@users.noreply.github.com", + "user": null + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [7514] + }, + { + "sha": "ef11f77836ccf85d4458aa18398c36ba592616a5", + "subject": "fix(evidence): Reject non-file destinations before overwrite advice (#7495)", + "body": "fix(evidence): Reject non-file destinations before overwrite advice (#7495)\n\nCheck destination kind before overwrite policy and cover directory recovery,\nregular-file controls, symlink modes and preservation.\n\nFixes #7444.\n\nIndependent review: APPROVE for patch SHA-256\n3d65eb23d01da9b6df786ad0db337dcff79d85923f23678a5168babb88c16080,\nrelayed by the coordinating thread (reviewer identity not supplied in the\ndelegated packet). Triggers: file I/O, error handling, three shipping files.\n\nValidation: baseline/candidate runtime builds and actual synthetic CLI probes;\ninitial focused run 70 passed, 2 Windows EPERM fixture failures, 3 skipped.\nFinal changed filesystem file 42 passed, 5 skipped; symlink semantics and\nfull aggregate checks remain unverified. Targeted format/lint/discovery passed.", + "parents": ["0cd7ef456bf960da265e04b341e82a24b1e377d5"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7495] + }, + { + "sha": "aa210b7ccc40599a357f74cfefcdd7dac215c11e", + "subject": "feat(environment): serve the writes that later reads explain (#7274)", + "body": "feat(environment): serve the writes that later reads explain (#7274)\n\n* feat(environment): serve the writes callers make without recorded form fields\n\n- A create member a recording sent empty (\"\", null, false, [] or {}) is no\n longer required; a call that leaves it out is applied as sending that value\n (body.blank).\n- List views render envelope members that list the listed entities' ids\n (Paperless's `all`), so creates in such collections are confirmed.\n- Updates move their entity in collections kept sorted by a field they write,\n and a failed whole-collection read after an update can teach that order.\n- A later create that stores an unruled field otherwise is withheld at the\n create, and an item read may fill values a create's answer had not loaded.\n- An unsent field respelled between null, [] and {} is unchanged.\n- The skill asks for one create with every field and one with only what a\n person must give.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): show how to read signed-in pages before recording\n\nAgents guessed capture keys (artifacts, dom, final) to see pages behind\nsign-in, which inspect_web_page cannot reach.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): accept every empty spelling recorded creates sent\n\nA create that fills only what a person must give sends `null` where the\nfull create sent a string, and `null` or `false` for the same flag. The\nmerged plan now accepts each recorded empty value, and a call that leaves\nthe member out is applied as the earliest call sent it.\n\nAlso adds the spec folder for this change.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): keep the vary-fields step neutral on UI or API writes\n\nAgents read \"the form\" as a cue to write through the UI, where some\napplications' request bodies are not exposed; a body-unusable UI write\nnow re-records once with request steps.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record verification for blank members and sorted writes\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): address review of blank members and sorted writes\n\n- Bulk updates move their entities in turn against the others' earlier\n values and install the final order once, as replay does.\n- A member's recorded empty values stay accepted once a later call teaches\n its default; a left-out member with a default keeps the default.\n- Write answers spell empty lists and maps as their recorded answers did.\n- A rename can teach a sort when the creates chose one by a field the\n update did not write, such as ids that ascend with titles.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve the writes that later reads explain\n\n- An item read whose object is marked deleted (deleted, isDeleted or\n is_deleted true) agrees with an absent entity, as EspoCRM answers a\n deleted record; such an object never seeds or adopts an entity.\n- maxSize, max_results and maxResults are page sizes, for whole-collection\n list lines and the list query's limit role.\n- An item view also shows the fields only reads after its type's first write\n show, when no initial entity holds them (Vikunja's task subscription),\n without requiring them; write answers leave such a field out for entities\n without it, and it no longer withholds the write as incomplete-entities.\n- The skill asks updates to change the fields a person would change, and\n expects a deleted object to read back as 404 or marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer sent empty members as sent, and keep a placed create's order\n\n- A write answer spells an empty list or map the call did not send as its\n recorded answer did; one the call sent is answered as sent, so a create\n sending `[]` is not answered `null` because the first recorded create was.\n- A read listing the whole collection that placed a create leaves the create\n only the sorted inserts whose order that read follows, so a later rename\n cannot teach a sort an earlier read ruled out.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer bulk updates without fields only later reads show\n\nA bulk update's answer renders each entity with the same allowance a single\nupdate's answer has: a field only reads after the type's first write showed,\nwhich no initial entity holds, is left out for an entity without it, so a\nbulk update of a seeded task is no longer refused for lacking it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): correct how the EspoCRM contact update task passes\n\nThe agent trajectories show gpt-oss passes it by creating a replacement contact\nand deleting the original, since the served update refuses emailAddress; the\nupdate itself is refused in both builds.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a read of a served-deleted entity marked deleted\n\nAn application that soft-deletes still answers a deleted record by id, marked\ndeleted. Serving now keeps an entity a served delete removed from a type whose\nrecorded item reads show that, until a reset or load and within the size\ndata/add loads, and answers a read of it with its last fields and the flag\ntrue, instead of refusing the read.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers, check bulk answers with sent members, narrow inserts only on collection-order reads\n\n- A create whose item read loaded values its answer had not records them\n (`observation.read.unloaded`), and a served create's answer keeps them as\n the recorded answer showed them, a zero-time owner included, while the state\n holds the read's.\n- Replay checks a bulk update's recorded answers with each target's sent\n members, as serving answers them, so echoed `null` and `[]` no longer make\n the plan body-unusable.\n- A whole-collection read whose query sorts it shows the query's order, so it\n no longer narrows a create's sorted insert candidates.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the census with main's unknown-clock rule merged\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn a sort from a rename only when moving its entities reaches it\n\nServing moves only the entities a write changes in a collection kept sorted,\nso replay now tries a sort after a rename only when the entities no write the\nread exercised changed already follow it. Seeded folders listed out of title\norder no longer teach a title sort that serving would answer with another\norder.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers a sent value did not echo, and learn no sort from query-sorted reads\n\n- A served create keeps a value its recorded answer had not loaded unless the\n call sent that member and the plan stores it as sent, so a create sending\n `active: false` is answered `false` as recorded while the state holds the\n read's `true`.\n- A rename no longer teaches a sort from a whole-collection read its query\n sorts, whose ties need not follow the collection's own order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag in the state view and serve by it\n\nExtraction now records the member later item reads set true on a record the\napplication soft-deleted, and the item view carries it as `deleted_flag`.\nServing reads that fact instead of scanning recorded bodies itself, so one\nowner decides what a soft delete looks like.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag from item reads with a query too\n\nA client may read a deleted record back only with a query, such as a\ncache-busting parameter. Every successful read of the item tool now shows the\nflag; only plain later reads still add fields.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn sorts only from orders a list read confirmed\n\n- A sort retry after a failed whole-collection read requires the entities no\n write changed since a list last showed them to follow it already, rather than\n excusing every entity the update's tool ever wrote: an earlier rename a list\n confirmed in place stays where it was.\n- An update takes its creates' sort only from a create a list read showed\n placed; replay still tries a sort a create guessed from the initial order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): drop entities read back as deleted and answer soft deletes as deleted\n\n- A held entity a later read shows marked deleted is dropped, not adopted with\n the marked object's fields.\n- Bulk-update replay renders answers with the optional and later-only fields\n serving uses, so a bulk update of created and seeded entities replays.\n- A served delete of a soft-deleting type answers with the entity marked\n deleted, single and bulk.\n- A deleted flag only query reads showed is a field of the item view, so a\n served tombstone keeps it where live records omit it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): move updated entities only by placed sorts and keep query-sorted reads from confirming order\n\nReplay moved an updated entity by a sort a create only guessed, while the\nupdate plan exported only placed sorts, so a read could confirm an update\nby a move serving would not make. Both now use the placed sort. A passing\nlist read clears its entities from the moved set only when the state\ndecides the order of every entity it lists, so a read whose query sorts\nit no longer hides an earlier move from a later sort check.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): try a learned sort by moving each pending write in turn, as serving does\n\n#retrySort sorted the whole collection, which a list could match while\nserving, moving each renamed entity in turn against the others' values\nbefore their own writes, gave another order. The state now records the\nvalues each write replaced, and the retry replays the writes since a\nlist in collection order last showed their entities.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a served delete with the deleted flag its recorded answer showed\n\nAn application may answer a delete with the record as it was and mark it\ndeleted only on later reads. Delete answers, single and bulk, now take\nthe flag's value from the recorded answer; reads of a served-deleted\nentity still show it marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): set aside two hunks next to lines main's saved-values change rewrites\n\nMain's #7267 changes the lines beside the blank-member docs and the\nempty-spelling check in explainUpdate. Setting them aside lets that merge\napply cleanly; the commit after it puts them back on top of main's text.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): restore the set-aside hunks on main and bump the skill to 51\n\nPuts the blank-member docs and the empty-spelling check back beside main's\nslug and composed text and heldSlugRule. Main is at skill 50 with\ndifferent text, so this branch's skill changes take 51.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): bump the skill to 52 above #7260's 51\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep sorts a list showed in place ruled out, and created answers' nested members as recorded\n\nA whole list in collection order that showed a renamed entity where a\nsort by the renamed field would have moved it now rules that sort out, so\na later rename of the same entity cannot teach it. A create's answer\nleaves out members its item read added inside an object the answer\nshowed, as the recorded answer did; the state still stores them.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): compare soft-deleted read fields\n\n* fix(environment): preserve initially deleted item observations\n\n* fix(environment): index stored deleted entities separately\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["ef11f77836ccf85d4458aa18398c36ba592616a5"], + "authors": [ + { + "name": "Edgar Arakelyan", + "email": "edgar.arakelyan@scale.com", + "user": { + "login": "earakely-scale", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7274] + }, + { + "sha": "7bc6c5bf61deee59c93e3398d4726a9cb5df981c", + "subject": "feat(environment): serve the writes callers make without recorded form fields (#7260)", + "body": "feat(environment): serve the writes callers make without recorded form fields (#7260)\n\n* feat(environment): serve the writes callers make without recorded form fields\n\n- A create member a recording sent empty (\"\", null, false, [] or {}) is no\n longer required; a call that leaves it out is applied as sending that value\n (body.blank).\n- List views render envelope members that list the listed entities' ids\n (Paperless's `all`), so creates in such collections are confirmed.\n- Updates move their entity in collections kept sorted by a field they write,\n and a failed whole-collection read after an update can teach that order.\n- A later create that stores an unruled field otherwise is withheld at the\n create, and an item read may fill values a create's answer had not loaded.\n- An unsent field respelled between null, [] and {} is unchanged.\n- The skill asks for one create with every field and one with only what a\n person must give.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): show how to read signed-in pages before recording\n\nAgents guessed capture keys (artifacts, dom, final) to see pages behind\nsign-in, which inspect_web_page cannot reach.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): accept every empty spelling recorded creates sent\n\nA create that fills only what a person must give sends `null` where the\nfull create sent a string, and `null` or `false` for the same flag. The\nmerged plan now accepts each recorded empty value, and a call that leaves\nthe member out is applied as the earliest call sent it.\n\nAlso adds the spec folder for this change.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): keep the vary-fields step neutral on UI or API writes\n\nAgents read \"the form\" as a cue to write through the UI, where some\napplications' request bodies are not exposed; a body-unusable UI write\nnow re-records once with request steps.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record verification for blank members and sorted writes\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): address review of blank members and sorted writes\n\n- Bulk updates move their entities in turn against the others' earlier\n values and install the final order once, as replay does.\n- A member's recorded empty values stay accepted once a later call teaches\n its default; a left-out member with a default keeps the default.\n- Write answers spell empty lists and maps as their recorded answers did.\n- A rename can teach a sort when the creates chose one by a field the\n update did not write, such as ids that ascend with titles.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer sent empty members as sent, and keep a placed create's order\n\n- A write answer spells an empty list or map the call did not send as its\n recorded answer did; one the call sent is answered as sent, so a create\n sending `[]` is not answered `null` because the first recorded create was.\n- A read listing the whole collection that placed a create leaves the create\n only the sorted inserts whose order that read follows, so a later rename\n cannot teach a sort an earlier read ruled out.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers, check bulk answers with sent members, narrow inserts only on collection-order reads\n\n- A create whose item read loaded values its answer had not records them\n (`observation.read.unloaded`), and a served create's answer keeps them as\n the recorded answer showed them, a zero-time owner included, while the state\n holds the read's.\n- Replay checks a bulk update's recorded answers with each target's sent\n members, as serving answers them, so echoed `null` and `[]` no longer make\n the plan body-unusable.\n- A whole-collection read whose query sorts it shows the query's order, so it\n no longer narrows a create's sorted insert candidates.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn a sort from a rename only when moving its entities reaches it\n\nServing moves only the entities a write changes in a collection kept sorted,\nso replay now tries a sort after a rename only when the entities no write the\nread exercised changed already follow it. Seeded folders listed out of title\norder no longer teach a title sort that serving would answer with another\norder.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers a sent value did not echo, and learn no sort from query-sorted reads\n\n- A served create keeps a value its recorded answer had not loaded unless the\n call sent that member and the plan stores it as sent, so a create sending\n `active: false` is answered `false` as recorded while the state holds the\n read's `true`.\n- A rename no longer teaches a sort from a whole-collection read its query\n sorts, whose ties need not follow the collection's own order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn sorts only from orders a list read confirmed\n\n- A sort retry after a failed whole-collection read requires the entities no\n write changed since a list last showed them to follow it already, rather than\n excusing every entity the update's tool ever wrote: an earlier rename a list\n confirmed in place stays where it was.\n- An update takes its creates' sort only from a create a list read showed\n placed; replay still tries a sort a create guessed from the initial order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): move updated entities only by placed sorts and keep query-sorted reads from confirming order\n\nReplay moved an updated entity by a sort a create only guessed, while the\nupdate plan exported only placed sorts, so a read could confirm an update\nby a move serving would not make. Both now use the placed sort. A passing\nlist read clears its entities from the moved set only when the state\ndecides the order of every entity it lists, so a read whose query sorts\nit no longer hides an earlier move from a later sort check.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): try a learned sort by moving each pending write in turn, as serving does\n\n#retrySort sorted the whole collection, which a list could match while\nserving, moving each renamed entity in turn against the others' values\nbefore their own writes, gave another order. The state now records the\nvalues each write replaced, and the retry replays the writes since a\nlist in collection order last showed their entities.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): set aside two hunks next to lines main's saved-values change rewrites\n\nMain's #7267 changes the lines beside the blank-member docs and the\nempty-spelling check in explainUpdate. Setting them aside lets that merge\napply cleanly; the commit after it puts them back on top of main's text.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): restore the set-aside hunks on main and bump the skill to 51\n\nPuts the blank-member docs and the empty-spelling check back beside main's\nslug and composed text and heldSlugRule. Main is at skill 50 with\ndifferent text, so this branch's skill changes take 51.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep sorts a list showed in place ruled out, and created answers' nested members as recorded\n\nA whole list in collection order that showed a renamed entity where a\nsort by the renamed field would have moved it now rules that sort out, so\na later rename of the same entity cannot teach it. A create's answer\nleaves out members its item read added inside an object the answer\nshowed, as the recorded answer did; the state still stores them.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["aa210b7ccc40599a357f74cfefcdd7dac215c11e"], + "authors": [ + { + "name": "Edgar Arakelyan", + "email": "edgar.arakelyan@scale.com", + "user": { + "login": "earakely-scale", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7260] + }, + { + "sha": "5fcf0d2dcc2bf69143b5faece047aa4fadf639f3", + "subject": "fix(browser): save from gzip, deflate and cached responses within a bound (#7361)", + "body": "fix(browser): save from gzip, deflate and cached responses within a bound (#7361)\n\nA saved response's decoded size is bounded by its received size, or the\ndeclared length of one served from cache, times 1032 for each gzip or deflate\ncoding, the most DEFLATE expands. Grafana answers folder creates gzipped, so a\nUI step saving a new folder's uid was refused. Other codings and unknown or\nzero sizes stay refused before the body is read.\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["7bc6c5bf61deee59c93e3398d4726a9cb5df981c"], + "authors": [ + { + "name": "Edgar Arakelyan", + "email": "edgar.arakelyan@scale.com", + "user": { + "login": "earakely-scale", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7361] + }, + { + "sha": "6efb384261ea462064d83b692a9524d1700c7124", + "subject": "docs(uninstall): clarify malformed shared config retention (#7507)", + "body": "docs(uninstall): clarify malformed shared config retention (#7507)\n\nUninstall retains unverifiable shared registration storage without blocking\nREA-owned purge; document that exception beside the stop-before-removal rule.\n\nFixes #7320", + "parents": ["5fcf0d2dcc2bf69143b5faece047aa4fadf639f3"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [7507] + }, + { + "sha": "423d190026a48a94aef70c90eb6970f54b75d7ca", + "subject": "fix(cli): preserve Markdown table edge spaces (#7506)", + "body": "fix(cli): preserve Markdown table edge spaces (#7506)\n\nFixes morluto/rea#7432\n\nSigned-off-by: pqminh27 ", + "parents": ["6efb384261ea462064d83b692a9524d1700c7124"], + "authors": [ + { + "name": "PM", + "email": "76590223+pqminh27@users.noreply.github.com", + "user": { + "login": "pqminh27", + "__typename": "User" + } + } + ], + "pullRequests": [7506] + }, + { + "sha": "baec375c347f129cb109823cff31831e906039f0", + "subject": "fix(cli): validate outline-depth before numeric coercion (#7505)", + "body": "fix(cli): validate outline-depth before numeric coercion (#7505)\n\nFixes morluto/rea#7425\n\nSigned-off-by: pqminh27 ", + "parents": ["423d190026a48a94aef70c90eb6970f54b75d7ca"], + "authors": [ + { + "name": "PM", + "email": "76590223+pqminh27@users.noreply.github.com", + "user": { + "login": "pqminh27", + "__typename": "User" + } + } + ], + "pullRequests": [7505] + }, + { + "sha": "40b9c03f996270e944ff07cafb63be15ce903708", + "subject": "feat(environment): serve query numbers, counted values and made objects (#7332)", + "body": "feat(environment): serve query numbers, counted values and made objects (#7332)\n\n* feat(environment): serve the writes callers make without recorded form fields\n\n- A create member a recording sent empty (\"\", null, false, [] or {}) is no\n longer required; a call that leaves it out is applied as sending that value\n (body.blank).\n- List views render envelope members that list the listed entities' ids\n (Paperless's `all`), so creates in such collections are confirmed.\n- Updates move their entity in collections kept sorted by a field they write,\n and a failed whole-collection read after an update can teach that order.\n- A later create that stores an unruled field otherwise is withheld at the\n create, and an item read may fill values a create's answer had not loaded.\n- An unsent field respelled between null, [] and {} is unchanged.\n- The skill asks for one create with every field and one with only what a\n person must give.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): show how to read signed-in pages before recording\n\nAgents guessed capture keys (artifacts, dom, final) to see pages behind\nsign-in, which inspect_web_page cannot reach.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): accept every empty spelling recorded creates sent\n\nA create that fills only what a person must give sends `null` where the\nfull create sent a string, and `null` or `false` for the same flag. The\nmerged plan now accepts each recorded empty value, and a call that leaves\nthe member out is applied as the earliest call sent it.\n\nAlso adds the spec folder for this change.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): keep the vary-fields step neutral on UI or API writes\n\nAgents read \"the form\" as a cue to write through the UI, where some\napplications' request bodies are not exposed; a body-unusable UI write\nnow re-records once with request steps.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record verification for blank members and sorted writes\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): address review of blank members and sorted writes\n\n- Bulk updates move their entities in turn against the others' earlier\n values and install the final order once, as replay does.\n- A member's recorded empty values stay accepted once a later call teaches\n its default; a left-out member with a default keeps the default.\n- Write answers spell empty lists and maps as their recorded answers did.\n- A rename can teach a sort when the creates chose one by a field the\n update did not write, such as ids that ascend with titles.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve the writes that later reads explain\n\n- An item read whose object is marked deleted (deleted, isDeleted or\n is_deleted true) agrees with an absent entity, as EspoCRM answers a\n deleted record; such an object never seeds or adopts an entity.\n- maxSize, max_results and maxResults are page sizes, for whole-collection\n list lines and the list query's limit role.\n- An item view also shows the fields only reads after its type's first write\n show, when no initial entity holds them (Vikunja's task subscription),\n without requiring them; write answers leave such a field out for entities\n without it, and it no longer withholds the write as incomplete-entities.\n- The skill asks updates to change the fields a person would change, and\n expects a deleted object to read back as 404 or marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer sent empty members as sent, and keep a placed create's order\n\n- A write answer spells an empty list or map the call did not send as its\n recorded answer did; one the call sent is answered as sent, so a create\n sending `[]` is not answered `null` because the first recorded create was.\n- A read listing the whole collection that placed a create leaves the create\n only the sorted inserts whose order that read follows, so a later rename\n cannot teach a sort an earlier read ruled out.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer bulk updates without fields only later reads show\n\nA bulk update's answer renders each entity with the same allowance a single\nupdate's answer has: a field only reads after the type's first write showed,\nwhich no initial entity holds, is left out for an entity without it, so a\nbulk update of a seeded task is no longer refused for lacking it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): correct how the EspoCRM contact update task passes\n\nThe agent trajectories show gpt-oss passes it by creating a replacement contact\nand deleting the original, since the served update refuses emailAddress; the\nupdate itself is refused in both builds.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a read of a served-deleted entity marked deleted\n\nAn application that soft-deletes still answers a deleted record by id, marked\ndeleted. Serving now keeps an entity a served delete removed from a type whose\nrecorded item reads show that, until a reset or load and within the size\ndata/add loads, and answers a read of it with its last fields and the flag\ntrue, instead of refusing the read.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers, check bulk answers with sent members, narrow inserts only on collection-order reads\n\n- A create whose item read loaded values its answer had not records them\n (`observation.read.unloaded`), and a served create's answer keeps them as\n the recorded answer showed them, a zero-time owner included, while the state\n holds the read's.\n- Replay checks a bulk update's recorded answers with each target's sent\n members, as serving answers them, so echoed `null` and `[]` no longer make\n the plan body-unusable.\n- A whole-collection read whose query sorts it shows the query's order, so it\n no longer narrows a create's sorted insert candidates.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the census with main's unknown-clock rule merged\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve query numbers, counted values and made objects\n\n- A query parameter accepts a number or boolean, which serving sends as its\n JSON text, as agents send page sizes and flags.\n- A sequence may start at the value its first create took above every value\n its type held (Vikunja's per-project task index), and a later create's\n composed, template or started-sequence rule is adopted when it also spells\n the first create's value.\n- A made-object rule explains an object the application makes with each\n created entity: members the request stamped, members holding the entity's\n own id, and counts one past the held objects' values.\n- A create's answer names the id of the one object a one-element array member\n holds, so bulk creates link to their type.\n- The skill reads each listed object by id before writing.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): let a linked create take path values it stores\n\nA create linked to its type's own collection, whose path has no parameters,\naccepts any path values when its plan stores each one in a field, as a Vikunja\ntask stores its project; replay and serving apply it alike.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn a sort from a rename only when moving its entities reaches it\n\nServing moves only the entities a write changes in a collection kept sorted,\nso replay now tries a sort after a rename only when the entities no write the\nread exercised changed already follow it. Seeded folders listed out of title\norder no longer teach a title sort that serving would answer with another\norder.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers a sent value did not echo, and learn no sort from query-sorted reads\n\n- A served create keeps a value its recorded answer had not loaded unless the\n call sent that member and the plan stores it as sent, so a create sending\n `active: false` is answered `false` as recorded while the state holds the\n read's `true`.\n- A rename no longer teaches a sort from a whole-collection read its query\n sorts, whose ties need not follow the collection's own order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): verify query values, counted values and made objects\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag in the state view and serve by it\n\nExtraction now records the member later item reads set true on a record the\napplication soft-deleted, and the item view carries it as `deleted_flag`.\nServing reads that fact instead of scanning recorded bodies itself, so one\nowner decides what a soft delete looks like.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the call-values checks at #7274 93821024\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag from item reads with a query too\n\nA client may read a deleted record back only with a query, such as a\ncache-busting parameter. Every successful read of the item tool now shows the\nflag; only plain later reads still add fields.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the call-values checks at #7274 45832406\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn sorts only from orders a list read confirmed\n\n- A sort retry after a failed whole-collection read requires the entities no\n write changed since a list last showed them to follow it already, rather than\n excusing every entity the update's tool ever wrote: an earlier rename a list\n confirmed in place stays where it was.\n- An update takes its creates' sort only from a create a list read showed\n placed; replay still tries a sort a create guessed from the initial order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): drop entities read back as deleted and answer soft deletes as deleted\n\n- A held entity a later read shows marked deleted is dropped, not adopted with\n the marked object's fields.\n- Bulk-update replay renders answers with the optional and later-only fields\n serving uses, so a bulk update of created and seeded entities replays.\n- A served delete of a soft-deleting type answers with the entity marked\n deleted, single and bulk.\n- A deleted flag only query reads showed is a field of the item view, so a\n served tombstone keeps it where live records omit it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): check made objects as recorded and keep their ids and clocks honest\n\n- A made object's clock counts as a write clock, so a capture with no clock\n anchor withholds the create instead of stamping 1970.\n- Members holding the entity's identity follow the id written, generated or\n sent, through the type's id field.\n- A later create's made object is checked as recorded, before its own members\n are rewritten, so one naming another entity withholds the plan.\n- A later create's template is adopted only when it spells that create's value\n too, not just when the first create's text holds its source value.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): move updated entities only by placed sorts and keep query-sorted reads from confirming order\n\nReplay moved an updated entity by a sort a create only guessed, while the\nupdate plan exported only placed sorts, so a read could confirm an update\nby a move serving would not make. Both now use the placed sort. A passing\nlist read clears its entities from the moved set only when the state\ndecides the order of every entity it lists, so a read whose query sorts\nit no longer hides an earlier move from a later sort check.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): count six withheld plans that explain more, not seven\n\nThe bulk task create counted among them is served on this branch.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): try a learned sort by moving each pending write in turn, as serving does\n\n#retrySort sorted the whole collection, which a list could match while\nserving, moving each renamed entity in turn against the others' values\nbefore their own writes, gave another order. The state now records the\nvalues each write replaced, and the retry replays the writes since a\nlist in collection order last showed their entities.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a served delete with the deleted flag its recorded answer showed\n\nAn application may answer a delete with the record as it was and mark it\ndeleted only on later reads. Delete answers, single and bulk, now take\nthe flag's value from the recorded answer; reads of a served-deleted\nentity still show it marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): set aside two hunks next to lines main's saved-values change rewrites\n\nMain's #7267 changes the lines beside the blank-member docs and the\nempty-spelling check in explainUpdate. Setting them aside lets that merge\napply cleanly; the commit after it puts them back on top of main's text.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): restore the set-aside hunks on main and bump the skill to 51\n\nPuts the blank-member docs and the empty-spelling check back beside main's\nslug and composed text and heldSlugRule. Main is at skill 50 with\ndifferent text, so this branch's skill changes take 51.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): bump the skill to 52 above #7260's 51\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): put back the call-values hunks main's merge took its side for, and bump the skill to 53\n\nThe merge of main kept main's side where it overlapped this branch, so it\ncould commit without a conflict. This restores this branch's side next to\nmain's: made-object agreement beside the & slug spellings, sequence starts\nin the earlier evidence (now built by earlierOf), the combined value\nimports, and recording step 2 beside main's UI-first step 3. Main is at\nskill 50 and #7274 at 52, so this branch takes 53.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep sorts a list showed in place ruled out, and created answers' nested members as recorded\n\nA whole list in collection order that showed a renamed entity where a\nsort by the renamed field would have moved it now rules that sort out, so\na later rename of the same entity cannot teach it. A create's answer\nleaves out members its item read added inside an object the answer\nshowed, as the recorded answer did; the state still stores them.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep a later create's made object only with clocks its request stamped\n\nfollowsMadeObjects only checked that a made object's clocks parsed, so a\nlater create whose object showed an older clock still passed, while serving\nstamps the write's clock. Its clocks must now be in the rule's format and\nwithin the stamp window of that create's request.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): compare soft-deleted read fields\n\n* fix(environment): reject contradictory learned sequences\n\n* fix(environment): preserve initially deleted item observations\n\n* fix(environment): index stored deleted entities separately\n\n* fix(environment): replay lists that include deleted records\n\n* fix(environment): make no count of a made-object member earlier creates held alike\n\nA count only a later create shows starts at the exemplar's value, which is\nright only while the exemplar is the one create accepted: creates accepted\nafter it showed the member unchanged, which a count would have moved. The\nmerge now refuses such a count, as the top-level sequence check does.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["baec375c347f129cb109823cff31831e906039f0"], + "authors": [ + { + "name": "Edgar Arakelyan", + "email": "edgar.arakelyan@scale.com", + "user": { + "login": "earakely-scale", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7332] + }, + { + "sha": "aa6f6436c9cb211d913e0b65b150e977d13b7164", + "subject": "feat(cli): add CSV and TSV analysis views (#7254)", + "body": "feat(cli): add CSV and TSV analysis views (#7254)\n\n* feat(cli): add CSV and TSV analysis views\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\n* Update tests/boundary/cli/filteredArrayOutput.test.ts\n\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>\n\n* Update src/cli.ts\n\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>\n\n* fix(cli): address delimited export review feedback\n\n* fix(cli): format delimited output block in cliResultOutput\n\n* fix(cli): retain delimited view uncertainty and align completions\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["40b9c03f996270e944ff07cafb63be15ce903708"], + "authors": [ + { + "name": "Tapraj-Pathak", + "email": "165466587+Tapraj-Pathak@users.noreply.github.com", + "user": { + "login": "Tapraj-Pathak", + "__typename": "User" + } + }, + { + "name": "Copilot", + "email": "223556219+Copilot@users.noreply.github.com", + "user": { + "login": "Copilot", + "__typename": "User" + } + }, + { + "name": "greptile-apps[bot]", + "email": "165735046+greptile-apps[bot]@users.noreply.github.com", + "user": { + "login": "greptile-apps[bot]", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7254] + }, + { + "sha": "e556134302f055936c0295838d72ebcd5454bc96", + "subject": "fix(deps): patch fast-uri, qs and HTTP/3 certifi (#7704)", + "body": "fix(deps): patch fast-uri, qs and HTTP/3 certifi (#7704)\n\nRefresh compatible security fixes and verified dependency notices. Keep\nhistorical HTTP/3 guest verification separate from the refreshed trust store.\n\nFixes #7700\n\nAssisted-by: Aya (gensokyo-skills:aya-source-investigation)", + "parents": ["aa6f6436c9cb211d913e0b65b150e977d13b7164"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7704] + }, + { + "sha": "3d5c73f35c1d089807bf70e74da0e3002e08e52d", + "subject": "fix(cli): retain JSONL parser diagnostics under token counting (#7705)", + "body": "fix(cli): retain JSONL parser diagnostics under token counting (#7705)", + "parents": ["e556134302f055936c0295838d72ebcd5454bc96"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7705] + }, + { + "sha": "d3b31a0e29a67c8d3a2b756ec46744c27f70ea8f", + "subject": "feat(cli): report opt-in command timings (#7042)", + "body": "feat(cli): report opt-in command timings (#7042)\n\n* feat(cli): report opt-in command timings\n\n* fix(cli): time standalone MCP doctor\n\n* fix(cli): retain timing on doctor errors\n\n* fix(cli): preserve formatted version output with command timings\n\n---------\n\nCo-authored-by: dhruvac29 \nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["3d5c73f35c1d089807bf70e74da0e3002e08e52d"], + "authors": [ + { + "name": "Dhruvilkumar Ashokbhai Chodvadiya", + "email": "50516925+dhruvac29@users.noreply.github.com", + "user": { + "login": "dhruvac29", + "__typename": "User" + } + }, + { + "name": "dhruvac29", + "email": "dhruvac29@users.noreply.github.com", + "user": { + "login": "dhruvac29", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7042] + }, + { + "sha": "c01ed783ac970a47546d664b6792f69cacc2fca9", + "subject": "fix(elf): share section-table presence validation with notes (#7706)", + "body": "fix(elf): share section-table presence validation with notes (#7706)", + "parents": ["d3b31a0e29a67c8d3a2b756ec46744c27f70ea8f"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7706] + }, + { + "sha": "b69d8c54678f2c6f9217c1609a5e9d64880e5392", + "subject": "docs(changelog): repair historical release heading links (#7707)", + "body": "docs(changelog): repair historical release heading links (#7707)", + "parents": ["c01ed783ac970a47546d664b6792f69cacc2fca9"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7707] + }, + { + "sha": "ad7d4c1f4dd9cbd93229ee330e66c7a522e723e6", + "subject": "docs(errors): align MCP validation status and verification columns (#7708)", + "body": "docs(errors): align MCP validation status and verification columns (#7708)", + "parents": ["b69d8c54678f2c6f9217c1609a5e9d64880e5392"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7708] + }, + { + "sha": "c36971953c3c867e4f3a1f149dbf0022a8e10a73", + "subject": "feat(artifacts): inventory and extract Intel HEX and Motorola S-record regions (#7136)", + "body": "feat(artifacts): inventory and extract Intel HEX and Motorola S-record regions (#7136)\n\n* feat(artifacts): inventory and extract Intel HEX and Motorola S-record regions\n\nopen_binary refused Intel HEX and S-record programming files as an\nunsupported format, so inspect_artifact and extract_artifact could not\nanswer which bytes load at which addresses.\n\nRecognize both encodings by a fully valid first record and decode them\nstatically into address-contiguous regions, each an inventory entry named\n0x-0x.bin and extractable as raw bytes. Root format_metadata\nrecords the encoding and variant, record counts, unique and duplicate\nbytes, address bounds, termination, declared start address, S0 header and\nvalidated S5/S6 count. Gaps are never filled; start addresses are declared\nfacts, not proven entry points.\n\nChecksum, record-type, byte-count, line-length, overlap-conflict, address\nwrap and post-termination errors fail closed with the line number; a\nmissing termination record leaves coverage unknown. Decoding is bounded by\na 128 MiB file ceiling (decoded bytes are at most half the file and are\nreserved after the size check) and 65,536 address-discontiguous runs.\n\nRefs #7129\n\n* fix(artifacts): refuse Intel HEX extended address records with a non-zero address\n\n* fix(artifacts): bound HEX region copies and retain stream cancellation\n\n---------\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["ad7d4c1f4dd9cbd93229ee330e66c7a522e723e6"], + "authors": [ + { + "name": "Aaditya", + "email": "aadityasinha554@gmail.com", + "user": { + "login": "555aaditya", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7136] + }, + { + "sha": "fbb0e79354d8cc138026d01de393652913f821bf", + "subject": "fix(cli): reject empty observation duration selections (#7710)", + "body": "fix(cli): reject empty observation duration selections (#7710)", + "parents": ["c36971953c3c867e4f3a1f149dbf0022a8e10a73"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7710] + }, + { + "sha": "8397a0c9eb1d845e548ca1f31b8c63b78d485239", + "subject": "fix(plugins): align listing metadata with REA branding (#7711)", + "body": "fix(plugins): align listing metadata with REA branding (#7711)\n\nUse one packaged icon for Codex and Claude, and align listing descriptions with the repository About.", + "parents": ["fbb0e79354d8cc138026d01de393652913f821bf"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7711] + }, + { + "sha": "b594fbc3e739ade1fbb9ce38846ed1c3a991273e", + "subject": "fix(apple): scope application roots to the inventory format (#7714)", + "body": "fix(apple): scope application roots to the inventory format (#7714)", + "parents": ["8397a0c9eb1d845e548ca1f31b8c63b78d485239"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7714] + }, + { + "sha": "5ae77656e7c4b9c40e84566a445660af34a23ad4", + "subject": "feat(workflows): expose guided prompts through CLI and MCP (#6995)", + "body": "feat(workflows): expose guided prompts through CLI and MCP (#6995)\n\n* feat(workflows): expose guided prompts through CLI and MCP\n\n* fix(workflows): address guided workflow review findings\n\n* fix(workflows): preserve scoped contracts and actionable validation\n\n* test(workflows): allow bounded CLI startup on shared hosts\n\n* test(workflows): audit guidance effects and content provenance\n\n* perf(workflows): defer rendering and separate catalog scope\n\n---------\n\nCo-authored-by: Deepak-Kambala \nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["b594fbc3e739ade1fbb9ce38846ed1c3a991273e"], + "authors": [ + { + "name": "Deepak Kambala", + "email": "deepakkambala21@gmail.com", + "user": { + "login": "Deepak-Kambala", + "__typename": "User" + } + }, + { + "name": "Deepak-Kambala", + "email": "deepakkambala07@gmail.com", + "user": null + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [6995] + }, + { + "sha": "b0fb51cb4c54a73da130087c3f3875ecdf1ea43e", + "subject": "fix(environment): share inline state byte admission (#7721)", + "body": "fix(environment): share inline state byte admission (#7721)\n\nReuse shared padded-base64 facts and derive encoded admission from the existing decoded-byte budget. Refuse overflow before decoded allocation and retain padded syntax. Cover capacity, compact HTTP replies and live MCP state readback.\n\nFixes #7719\n\nAssisted-by: Reimu (gensokyo-skills:reimu-incident-triage)\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)", + "parents": ["5ae77656e7c4b9c40e84566a445660af34a23ad4"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7721] + }, + { + "sha": "a0a1962e06e47b641d1cf6afbeb60d1d00da2b70", + "subject": "fix(cli): validate byte queries before opening targets (#7723)", + "body": "fix(cli): validate byte queries before opening targets (#7723)", + "parents": ["b0fb51cb4c54a73da130087c3f3875ecdf1ea43e"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7723] + }, + { + "sha": "0e4b806db14f2cbdf4a31a6268fe1a3514401677", + "subject": "fix(cli): preserve missing-selection Markdown token windows (#7726)", + "body": "fix(cli): preserve missing-selection Markdown token windows (#7726)", + "parents": ["a0a1962e06e47b641d1cf6afbeb60d1d00da2b70"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7726] + }, + { + "sha": "2b8fb387b6d1204f6c6e8abb89d075b7d95ba402", + "subject": "fix(windows): resolve default tools before process launch (#7725)", + "body": "fix(windows): resolve default tools before process launch (#7725)\n\nResolve Windows ADB, Apktool and update commands against the selected\nPATH/PATHEXT before launch. Keep explicit paths and relative PATH choices,\nreport lookup failures, and reuse absolute batch invocation and ownership.\n\nAdd native launch/argv regressions, real npm metadata probes and focused\nCI ownership so these boundaries retain Windows verification on the fast tier.\n\nFixes #7724\n\nAssisted-by: Reimu (gensokyo-skills:reimu-incident-triage)\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)\nAssisted-by: Yukari (gensokyo-skills:yukari-boundary-analysis)", + "parents": ["0e4b806db14f2cbdf4a31a6268fe1a3514401677"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7725] + }, + { + "sha": "6a226bd09263776b080e7e25c218ed738b2fd068", + "subject": "fix(apple): validate keyed archive selectors consistently (#7728)", + "body": "fix(apple): validate keyed archive selectors consistently (#7728)", + "parents": ["2b8fb387b6d1204f6c6e8abb89d075b7d95ba402"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7728] + }, + { + "sha": "e78ac1a55b4a4902efb6074412227c29eba9ad00", + "subject": "feat(artifacts): read UnityFS AssetBundle containers (#7699)", + "body": "feat(artifacts): read UnityFS AssetBundle containers (#7699)\n\n* feat(artifacts): read UnityFS AssetBundle containers\n\ninspect-artifact and extract-artifact now recognize the UnityFS signature\nand treat format versions 6 through 9 as containers. Header facts (format\nversion, player/engine strings, declared size, dataflags, blocks-info\nbounds and the declared 16-byte data hash) are retained alongside a\ndirectory of CAB-* and .resS members. Member bytes stream on demand:\nonly the blocks covering the requested member are read and decompressed\nwith bounded expansion and cancellation.\n\nBundles declaring asset-bundle encryption keep header facts and report\nunknown directory coverage. LZMA blocks-info reports unknown coverage;\nLZMA member reads fail as unavailable while the directory stays\nreadable. Malformed counts, out-of-stream members and declared sizes\nbeyond the file fail as format errors. UnityFS classifies by bytes in\nroot detection, inventory graph construction and desktop inspection,\nwhich emits a unityfs-header fact.\n\nValidation: tsc --noEmit, oxlint (no new findings on touched files),\n17 reader tests covering LZ4HC/uncompressed tables, blocks-info at end,\nformat 6 without padding alignment, multi-block members, malformed\ninput, unsupported compression, cancellation and abandoned streams;\nfull artifacts/domain/conformance suites pass. Verified against one\nreal YooAsset bundle (Unity 2021.3.32f1, format 8, LZ4HC): the\nstreamed SerializedFile contained its managed assembly byte-identical\nto a UnityPy extraction. Other producer variants unverified.\n\n* fix(unityfs): own bounded member reads and preserve partial evidence\n\n* refactor(unityfs): clarify producer revision flag decisions\n\n* fix(artifacts): preserve coverage authority and bound UnityFS block work\n\n---------\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["6a226bd09263776b080e7e25c218ed738b2fd068"], + "authors": [ + { + "name": "blankym", + "email": "407559178@qq.com", + "user": { + "login": "blankym", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7699] + }, + { + "sha": "3b242491a430b3807853436bfeb9568d606169ac", + "subject": "fix(cli): attribute keyed archive errors to archive argument (#7731)", + "body": "fix(cli): attribute keyed archive errors to archive argument (#7731)\n\n* fix(cli): attribute keyed archive errors to archive argument\n\n* test(cli): assert input-error projection reference reuse", + "parents": ["e78ac1a55b4a4902efb6074412227c29eba9ad00"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7731] + }, + { + "sha": "60bad9ed06474f5e4f2c09dce19f00f78591950e", + "subject": "fix(hopper)!: admit macOS arguments before application handoff (#7732)", + "body": "fix(hopper)!: admit macOS arguments before application handoff (#7732)\n\nAdmit the final macOS Hopper launcher arguments before application handoff.\nKeep prepared-image source identity, return precise typed refusal locations,\nand preserve bootstrap/lease cleanup. Update native CLI/MCP recovery\ncoverage and the installation guide.\n\nFixes #7727\n\nBREAKING CHANGE: macOS Hopper launches refuse double quotes, backslashes\nand line breaks in final helper paths or arguments before application\nhandoff. Select literal-safe launcher/runtime/database paths and loader\narguments, or a compatible provider. Original executable names can remain\nunchanged when their prepared image path is literal-safe.\n\nAssisted-by: Reimu (gensokyo-skills:reimu-incident-triage)\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)\nAssisted-by: Yukari (gensokyo-skills:yukari-boundary-analysis)", + "parents": ["3b242491a430b3807853436bfeb9568d606169ac"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7732] + }, + { + "sha": "df7119aeede60f9f81a74f29d6606c49adb79d8e", + "subject": "fix(mcp): distinguish validation from connection loss (#7761)", + "body": "fix(mcp): distinguish validation from connection loss (#7761)\n\n* fix(mcp): distinguish validation from connection loss\n\n* fix(mcp): reuse parsed HTTP disconnect facts", + "parents": ["60bad9ed06474f5e4f2c09dce19f00f78591950e"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7761] + }, + { + "sha": "f483eab5435b0cbbc41b49959651cd719535bc70", + "subject": "fix(captures): exclude normalized native numeric values (#7764)", + "body": "fix(captures): exclude normalized native numeric values (#7764)", + "parents": ["df7119aeede60f9f81a74f29d6606c49adb79d8e"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7764] + }, + { + "sha": "06d1247836b1fc856c4a6ec29e2c81927f445dd9", + "subject": "fix(evidence): preserve residual unknown constraint diagnostics (#7770)", + "body": "fix(evidence): preserve residual unknown constraint diagnostics (#7770)", + "parents": ["f483eab5435b0cbbc41b49959651cd719535bc70"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7770] + }, + { + "sha": "18a8e71c9f3749be2b950c48dc507bbf3860a222", + "subject": "feat(artifacts): add U-Boot legacy uImage reader (part of #7129) (#7234)", + "body": "feat(artifacts): add U-Boot legacy uImage reader (part of #7129) (#7234)\n\n* feat(artifacts): add U-Boot legacy uImage reader (part of #7129)\n\nRecognize legacy uImages by their 0x27051956 magic and inventory them as containers: 64-byte header facts (arch/os/type/compression raw and named, load/entry addresses, name, timestamp) with header and data CRC32 verified, stored payload extractable as payload.bin, and multi-file images split from the stored size table into image-.bin. Compressed payloads stay as stored; nothing is executed or decompressed. Wires the format through classification, the artifact reader dispatch, extraction, and the evidence/snapshot format vocabularies. Related to #7129 (uImage part only); HEX/SREC and FIT are out of scope.\n\n* fix(uimage): preserve aligned component ranges and exact header facts\n\n* fix(uimage): retain buffered members through consumption and cancellation\n\n* fix(uimage): preserve active read and validation failure precedence\n\n---------\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["06d1247836b1fc856c4a6ec29e2c81927f445dd9"], + "authors": [ + { + "name": "Cipher", + "email": "268238676+iamcipherdev@users.noreply.github.com", + "user": { + "login": "iamcipherdev", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7234] + }, + { + "sha": "c77735fa83a66552ec45eef435ab3bb36026ecfe", + "subject": "fix(setup)!: bind managed registrations to selected installation", + "body": "fix(setup)!: bind managed registrations to selected installation\n\nUse one command owner for setup, client writers, Gemini policy and CLI defaults.\nMigrate recognized runner registrations with backups and remove runner prewarm.\nRetain unknown identities and exercise real offline npm, CLI and MCP workflows.\n\nFixes #7757\n\nBREAKING CHANGE: managed MCP registrations use the selected absolute runtime\nand REA entry script, including package-runner cache paths. Keep that installation\navailable or restore it before setup; unknown registrations require confirmed\nmanual repair. Setup no longer returns prewarm or emits its progress events.\n\nAssisted-by: Reimu (gensokyo-skills:reimu-incident-triage)\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)\nAssisted-by: Yukari (gensokyo-skills:yukari-boundary-analysis)", + "parents": ["18a8e71c9f3749be2b950c48dc507bbf3860a222"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7765] + }, + { + "sha": "09225b08e1acdf0da9759956cffbfce341f6e082", + "subject": "feat(artifacts): read Godot 3 PCK version 1 archives (#7781)", + "body": "feat(artifacts): read Godot 3 PCK version 1 archives (#7781)", + "parents": ["c77735fa83a66552ec45eef435ab3bb36026ecfe"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7781] + }, + { + "sha": "fea4f2e397d5a411228a7dcc299c4216b33e76ea", + "subject": "fix(javascript): test literals for Next page paths in linear time (#7748)", + "body": "fix(javascript): test literals for Next page paths in linear time (#7748)\n\nEvery source string literal without an established Next root was tested\nagainst /(?:^|\\/)app\\/(?:[\\s\\S]*\\/)?page(?:\\.[cm]?[jt]sx?|-[^/?#]+\\.js|)(?:[?#].*)?$/u.\nThe unanchored search restarted at every app/ segment and rescanned to the\nend of the literal, and each page? or page# candidate scanned to the next\nline terminator before $ failed. A long literal therefore took quadratic\ntime on the analysis thread: about 6 s for a 256 KB literal of repeated\napp/ segments, and 3.5 s for 224 KB of x/page? followed by a newline.\n\nThe first app/ segment admits every later page segment, and . cannot cross\na line terminator, so a query or fragment after the page filename starts on\nthe last line. Test the tail after the first app/ segment one page segment\nat a time instead; results are unchanged.", + "parents": ["09225b08e1acdf0da9759956cffbfce341f6e082"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [7748] + }, + { + "sha": "33698e6b31a474760a74c6f9b3ad2316ad8cffc7", + "subject": "fix(apktool): read Apktool 2.9+ metadata in its line-oriented dialect (#7747)", + "body": "fix(apktool): read Apktool 2.9+ metadata in its line-oriented dialect (#7747)\n\nApktool 2.9.0 replaced SnakeYAML with the YamlWriter that 3.x still uses:\napktool.yml starts with an untagged `version: 2.x.y` line and strings are\nwritten unquoted with Java-style escapes. Only a `version: 3.x.y` header\nselected the producer dialect, so 2.9.0-2.12.x output went through YAML\ncore parsing: a versionName of `1.0 #beta` became `1.0`, escaped quotes kept\ntheir backslashes, an empty name became null, and `1.0: beta` made the whole\ndecode fail as invalid metadata.\n\nSelect the line-oriented reader for 2.9.0 and later as well. Older tagged\nSnakeYAML documents keep YAML scalar semantics.", + "parents": ["fea4f2e397d5a411228a7dcc299c4216b33e76ea"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [7747] + }, + { + "sha": "7aa943c14bea11f4ab0c8ca8cfe60f6bb462ebdd", + "subject": "fix(javascript): resolve Vite build-output preload dependencies (#7745)", + "body": "fix(javascript): resolve Vite build-output preload dependencies (#7745)\n\n* fix(javascript): resolve Vite build-output preload dependencies\n\nWith an absolute base, Vite writes __vite__mapDeps entries relative to the\nbuild output directory (for example assets/chunk.js), and its preload helper\nprefixes the configured base at runtime. REA emitted these entries as\ndynamic-import module specifiers, so a scheme-less path without a leading\ndot resolved as a bare package and every entry was reported as an\nunresolved \"external\" module, even when the build output directory was\nselected.\n\nThe static analyzer now marks such entries with a vite-output: specifier,\nas Webpack chunk loads are marked with chunk:. Entries starting with ./,\n../ or /, and scheme-qualified entries, keep their previous handling. The\ngraph resolves a marked entry as a URL path under each ancestor directory\nof the importing file; exactly one ancestor holding the file establishes\nthe build output directory. Otherwise the entry is not-found (or\nunavailable when several ancestors match) with a limitation that names\nthe build output directory.\n\nOn a synthetic 7-file Vite build, the 12 preload entries that were\n\"external\" now resolve when the build output directory is selected, and\nare not-found with that guidance when only assets/ is selected.\n\n* fix(javascript): keep unanalyzed Vite output candidates\n\nresolveViteOutputDependency considered only resolved ancestors. A file\nthat exists under an ancestor but was not analyzed (for example\ndist/assets/lazy.css for the entry assets/lazy.css) resolves there as\nunavailable, and that result was replaced by the root's not-found with a\nlimitation saying that no ancestor holds the file.\n\nKeep resolved and unavailable ancestor candidates together. One candidate\nis returned with its own path and limitations; several are reported as\nunavailable with every candidate path and limitation. Only when no\nancestor can hold the file does the root's not-found result stand.", + "parents": ["33698e6b31a474760a74c6f9b3ad2316ad8cffc7"], + "authors": [ + { + "name": "JG Tromp", + "email": "gijstromp@planet.nl", + "user": { + "login": "jgt87", + "__typename": "User" + } + } + ], + "pullRequests": [7745] + }, + { + "sha": "8b74f30bf931481b976f482b1d561219766f32ac", + "subject": "fix(javascript): stop double-expanding application projection estimates (#7744)", + "body": "fix(javascript): stop double-expanding application projection estimates (#7744)\n\n* fix(javascript): stop double-expanding application projection estimates\n\nestimateJavaScriptStaticApplicationProjection multiplied the per-record\nmetadata allowance (2 KB plus the path) by the 8x expansion that it also\napplies to checkpoint bytes. A projected record serializes to about 0.46 KB,\nso the allowance alone already covers retention; expanded again, the\ncharge was about 25x the serialized application relationships.\n\nThe charge accumulates in the parent's shared result budget. On a\nsynthetic 2.8 MB Vite-style build (88 files, one 456 KB chunk), the first\n10 files used 2.0 GB of a 2.08 GB budget while the parent heap held about\n300 MiB. The other 78 files lost their application relationships and were\noffered a 0-byte semantic budget. On a 201-file build the charges exceeded\nthe budget at file 93 and the analysis failed with resource_constraint,\nleaving the remaining sources without static facts.\n\nKeep the 8x expansion for checkpoint and repeated bytes and count the\nper-record allowance once. The same builds now refuse 14 and 102\nprojections instead of 78 and a failed run; peak RSS stays at 1.2 GB and\n2.0 GB under a 4.2 GB parent heap limit.\n\nworkerFailureComposition simulated 64 KiB of parent result budget, which\nthe corrected charge for its one-finding checkpoint fits. Lower that\nheadroom to 32 KiB so the case still exercises a refused projection.\n\n* test(javascript): cover application projections near the shared parent budget\n\nThe estimate test compares one file's charge with its serialized graph,\nbut no test put several sources against one parent result budget. Replay\none recorded static checkpoint for five sources against an exact budget:\nsources 1-3 fit, source 4 misses by half a source and keeps its static\nfacts with the reported required and budget bytes, and the last source\nfits again once no checkpoint reserve is held back. A worker that charges\nthe projection twice, or not at all, passes the existing tests and fails\nthis one.\n\n* test(javascript): cover a malformed source before a valid one under the shared budget\n\nThe testing guide asks representation-expansion and capacity changes for\na large malformed input followed by a valid input, and for escaped or\nexpanded representations.\n\nUnder an exact parent budget, a 3 MiB checkpoint cut off inside a string\ncomes first and is rejected as unreadable output with no static facts.\nThe valid source after it keeps its application relationships; it fits\nonly if the rejected bytes took no charge. A worker that charges the\nstatic checkpoint on receipt, before parsing, passes the existing tests\nand fails this one.\n\nThe estimate ratio test also runs with a nested source path and storage\nkeys holding quotes, backslashes, a tab and multibyte text, which expand\nin serialized JSON; the charge stays within 3x to 8x of the serialized\napplication graph (5.3x).", + "parents": ["7aa943c14bea11f4ab0c8ca8cfe60f6bb462ebdd"], + "authors": [ + { + "name": "JG Tromp", + "email": "gijstromp@planet.nl", + "user": { + "login": "jgt87", + "__typename": "User" + } + } + ], + "pullRequests": [7744] + }, + { + "sha": "7c389cbefc9c79ab22207caaca2508ea0ee6697b", + "subject": "fix(javascript): keep both-direction feature traces from crossing shared containers (#7743)", + "body": "fix(javascript): keep both-direction feature traces from crossing shared containers (#7743)\n\n* fix(javascript): keep both-direction feature traces from crossing shared containers\n\ntrace_application_feature with direction \"both\" walked the application\ngraph as if it were undirected. From a seed, one outgoing or incoming step\ninto a shared container (an asset or the artifact root) followed by steps\nin the other direction reached every sibling of that container, so a trace\nseeded on one storage key returned the whole connected graph.\n\n\"both\" now returns the union of the outgoing and incoming closures. Each\nwalk keeps its own predecessor chains, so a terminal path never changes\ndirection midway. \"outgoing\" and \"incoming\" are unchanged.\n\n* test(javascript): check both-direction trace paths end to end\n\nThe existing tests checked predecessor maps but no returned path. Add a\ntrace whose seed reaches one storage terminal outgoing and another\nincoming, and assert each path's complete node_ids and edge_ids. A\npathTo that reads only the first walk's map returns a one-node path for\nthe incoming terminal and fails this test.\n\n* fix(javascript): confine only ascended containers in both-direction traces\n\nMaking \"both\" the union of separate outgoing and incoming walks dropped\nmodules that a feature reaches by crossing directions. In the Notes\nknown-answer evaluation, the notes:export channel is pointed at by both\nthe preload asset (invokes) and the handler (handles); its preload,\nrenderer and csv modules are reached only through relationships that\nchange direction, so the trace kept main.js alone and the feature_modules\nclaim failed in tests/boundary/mcp/agentKnownAnswerMcp.test.ts.\n\nWalk both directions in one traversal again, and confine only the\ncontainment case the change was meant to stop: a node reached by stepping\nup a contains edge from one of its children follows only further contains\nsteps up. A shared asset or artifact root then no longer leads into its\nother children, while relationships across the feature are kept. The\nNotes trace returns csv.js, main.js, preload.js and renderer.js again\n(30 nodes; the previous main returned the whole 32-node graph).\noutgoing and incoming traces are unchanged, and paths come from one\npredecessor map again, as before this branch.", + "parents": ["8b74f30bf931481b976f482b1d561219766f32ac"], + "authors": [ + { + "name": "JG Tromp", + "email": "gijstromp@planet.nl", + "user": { + "login": "jgt87", + "__typename": "User" + } + } + ], + "pullRequests": [7743] + }, + { + "sha": "9593bc536b0549f0997e6b7922904f8fd1e91021", + "subject": "fix(protobuf): reject malformed descriptor field declarations (#7730)", + "body": "fix(protobuf): reject malformed descriptor field declarations (#7730)", + "parents": ["7c389cbefc9c79ab22207caaca2508ea0ee6697b"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7730] + }, + { + "sha": "ac545adae21893828d20aec31f098f6533e2ed0d", + "subject": "fix(apk): classify fixed inspection allowances as nonretryable (#7784)", + "body": "fix(apk): classify fixed inspection allowances as nonretryable (#7784)", + "parents": ["9593bc536b0549f0997e6b7922904f8fd1e91021"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7784] + }, + { + "sha": "23e7c4e8e2a713ab40221cc83752c721be1ed062", + "subject": "fix(setup): preserve specific skill path recovery (#7791)", + "body": "fix(setup): preserve specific skill path recovery (#7791)", + "parents": ["ac545adae21893828d20aec31f098f6533e2ed0d"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7791] + }, + { + "sha": "b9a8f8e9f25feb9cc97bf4960748f2bdf8c898bc", + "subject": "docs(update): align error catalog with current recovery (#7795)", + "body": "docs(update): align error catalog with current recovery (#7795)", + "parents": ["23e7c4e8e2a713ab40221cc83752c721be1ed062"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7795] + }, + { + "sha": "7b6d872a25f84772a49bcdc7ea392028b7328857", + "subject": "docs: celebrate 400,000 GitHub stars 🎉 (#7801)", + "body": "docs: celebrate 400,000 GitHub stars 🎉 (#7801)\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["b9a8f8e9f25feb9cc97bf4960748f2bdf8c898bc"], + "authors": [ + { + "name": "Ysopwnable", + "email": "161784452+N0zoM1z0@users.noreply.github.com", + "user": { + "login": "N0zoM1z0", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7801] + }, + { + "sha": "b14b94f0f5f0da0696271dd57b571fff57ee1ddc", + "subject": "fix(asn1): reject non-minimal OID subidentifiers (#7800)", + "body": "fix(asn1): reject non-minimal OID subidentifiers (#7800)", + "parents": ["7b6d872a25f84772a49bcdc7ea392028b7328857"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7800] + }, + { + "sha": "6fd5d347c71278fe1593fc3b7246a3319bdf8043", + "subject": "fix(browser): ignore repeated CSP directives within one policy (#7798)", + "body": "fix(browser): ignore repeated CSP directives within one policy (#7798)\n\nCSP3 parsing keeps the first directive of each name in a policy and ignores\nlater repeats; Chrome reports \"Ignoring duplicate Content-Security-Policy\ndirective\". parseCsp flattened every policy's directives into one stream, so\na header such as `script-src 'self'; script-src 'unsafe-inline'` reported the\nignored `'unsafe-inline'` directive as declared and counted nonces and hashes\nfrom it. Track directive names per policy so only the effective directive is\nretained, while the same name in separate comma-separated or repeated-field\npolicies is still listed once per policy.", + "parents": ["b14b94f0f5f0da0696271dd57b571fff57ee1ddc"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [7798] + }, + { + "sha": "8f97a45483a1313a8e415778e0dbff4677b5ed9c", + "subject": "fix(plist): end OpenStep comments at native line separators (#7793)", + "body": "fix(plist): end OpenStep comments at native line separators (#7793)", + "parents": ["6fd5d347c71278fe1593fc3b7246a3319bdf8043"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7793] + }, + { + "sha": "6c895eeb8e6b26bac1d551fc6660ee075a76fd6b", + "subject": "fix(process)!: redact sensitive terminal echoes before retaining Evidence (#7804)", + "body": "fix(process)!: redact sensitive terminal echoes before retaining Evidence (#7804)\n\nSeal sensitive terminal chunks before deferred rendering, apply one bounded\ncapture-local literal matcher, and retain exact redacted byte accounting.\nKeep private input facts in explicit fields and separate comparison policies.\nRetain distinct terminal failures once and verify structured refusal facts.\n\nFixes #7782\n\nBREAKING CHANGE: sensitive interaction data is empty with sensitive and input_bytes fields instead of a byte-count placeholder. Sensitive raw_data is also redacted. Read input_bytes and recapture both comparison sides when migrating older private-input Evidence.\n\nAssisted-by: Reimu (gensokyo-skills:reimu-incident-triage)\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)\nAssisted-by: Yukari (gensokyo-skills:yukari-boundary-analysis)", + "parents": ["8f97a45483a1313a8e415778e0dbff4677b5ed9c"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7804] + }, + { + "sha": "64196b08cab9fab15649b6d0058f980cd3f733f6", + "subject": "feat(artifacts): inventory and extract ESP32 firmware images (#7498)", + "body": "feat(artifacts): inventory and extract ESP32 firmware images (#7498)\n\n* feat(artifacts): inventory and extract ESP32 firmware images\n\nESP32-family app and bootloader images (magic 0xE9) had no reader, so\nopen_binary refused OTA downloads, app partitions and bootloaders.\n\nAdd the esp-image container format behind inspect_artifact and\nextract_artifact. A pure decoder reads each byte once and keeps only\nfixed-size fields. Derived facts cover the chip, from a table cited to\nESP-IDF v6.1; segment classification as ESP-IDF's should_map and\nshould_load; checksum and appended SHA-256 results; app and bootloader\ndescriptors; Secure Boot v2 signature blocks, observed and unverified;\nand undescribed trailing byte ranges. Truncation and undescribed bytes\nmake coverage unknown. ESP8266 images are refused with a specific\nreason, and ciphertext stays unrecognized.\n\nAdd the format to every target, Evidence, snapshot, live-summary and\nartifact vocabulary, document it, and add an optional verify:esp-images\nlane that compares esptool-built images with esptool image-info and\nespsecure signature-info-v2.\n\nRefs #3615\n\n* test(artifacts): run the ESP image lane on esptool v5.6.0\n\nThe lane compared descriptor fields only when esptool image-info printed\none, so a descriptor that REA reports and esptool does not print passed\nwithout comparison. Compare the descriptor kind in both directions.\n\nRecord that the lane passed for all 13 images with esptool and espsecure\nv5.6.0, the version the layout facts cite, as well as with 4.12.0.\n\n* refactor(artifacts): define ESP image layout sizes once\n\nThe decoder and the derived facts each defined the segment-header,\nappended-digest and flash-sector sizes, the erased-byte scan and the\noffset formatter. Define them once with the other fixed-layout structures\nand import them in both places. The signature slot count is the one\nconstant that drives the slot scan.\n\nCorrect the observedEnd comment: it is the end of the last chunk read.\n\n* fix(artifacts): report ESP-IDF's segment length limit by chip\n\nESP-IDF's verify_segment_header rejects a segment of 16 MiB or more\nunless the chip maps flash through 32-bit cache addresses\n(SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP: ESP32-S3, P4, C5, C61, H4 and\nS31 in v6.1). Record that capability in the chip table and add a\nlimitation for such segments; unknown chips get none.\n\n`loaded` repeats should_load. It does not mean the bootloader accepts the\nsegment: verify_load_addresses still rejects one outside the chip's RAM,\nwhich REA does not model. Say so in the docs, the skill reference and the\ninventory limitation.\n\n* test(artifacts): check ESP lane tools first and verify extraction\n\nThe lane started work before checking its tools, so a missing RISC-V\ntarget, ld.lld, esptool or espsecure surfaced as a raw spawn or command\nerror. Check each one before building and name the variable to set. Warn\nwhen esptool is not v5.6.0, the release the layout facts cite.\n\nAssert each segment's class for the ESP32-C3 app, its variants and the\nbootloader, as the Xtensa image already did. Extract the app and the\nsigned image through the CLI and compare every file with the bytes at\nesptool's segment offsets or in the appended signature sector; the\nsource's SHA-256 must be unchanged and equal the reported root_sha256.\n\n* docs(artifacts): state what the ESP image lane does not establish\n\nThe Verification section listed the lane's checks but not its gaps: only\nESP32-C3 and ESP32 images come from a real producer, no real project\nbuild, OTA download or flash dump is inspected, no signature is verified,\nand the lane does not run in CI.\n\nRecord the timing of the final lane run on esptool v5.6.0.\n\n* fix(artifacts): compare ESP segment declarations\n\nSegment entries hash only their data, so compare_artifacts reported a\nsegment that moved to another load address with the same bytes as\nunchanged; only the image itself changed. Compare each segment's\nload_addr and data_len as its declaration, as Node SEA and PyInstaller\nmembers are compared, and count a changed declaration as a metadata\nchange, also when content is unavailable.\n\nHeader offsets are layout and the classification is derived, so neither\nis compared.\n\n* test(artifacts): run ESP lane commands as owned process trees\n\nThe lane ran its tools through execFile. A timeout killed only the direct\nchild, so a linker or assembler that Clang or GCC had started could keep\nrunning while the lane removed its workspace. Run every command through\ncreateVerifierCommands, check the tools inside withVerifierCleanup, and\nremove the workspace only after commands.close() has stopped every tree;\na failed close keeps the workspace.\n\nOnly a nonzero exit now counts as a refusal or an expected esptool\nfailure; timeouts and spawn failures propagate. Supervising each command\nroughly doubles the lane's run time.\n\n* test(artifacts): cancel ESP decoding after its first decoded chunk\n\nThe cancellation test requested cancel or close on setImmediate, which\ncan land while the file is still being opened and checked, so it never\nshowed that decoding had started. It also passed against a reader that\nignored both requests while decoding. Acknowledge the decoder's first\nchunk, then cancel or close, join the operation, and assert that no\nlater chunk reaches the decoder and that the reader ends closed.\n\n* docs(artifacts): record which ESP metadata comparison ignores\n\nSegments are compared by their declaration. The image's and the\nsignature blocks' format_metadata are not: every field comes from their\nown bytes, which content comparison already covers, and a block's\nimage_digest_matches follows the image's content.\n\n* docs(artifacts): state that ESP mmu_page_size is a base-2 logarithm\n\nThe app descriptor's mmu_page_size keeps ESP-IDF's name and value, the\nMMU page size in log base 2 as esp_app_desc_t declares it, so 16 means\n64 KiB. Say so in docs/esp-image.md and the schema comment; a reader\ncould otherwise take 16 as 16 KiB.\n\n* fix(esp-image): retain member consumption and share lifecycle regressions\n\n* test(artifacts): scope MCP catalogs and budget full-schema validation\n\n* test(artifacts): verify compact output profiles and document bounded catalogs\n\n* test(artifacts): close readers when cleanup-test admission fails\n\n* test(artifacts): compare ESP image limitations with their owners\n\nThe decoder and reader tests froze complete limitation sentences, so a\nharmless rewording failed them. The wording now has two owners:\nESP_IMAGE_LIMITATIONS in espImageFacts.ts, which the decoder, the inventory\nand the reader use, and ESP_DESCRIPTOR_LIMITATIONS beside the descriptor\ndecoder. Tests compare delivered limitations with the owner, called with the\nfacts each case establishes (segment index, declared and available bytes,\noffsets, chip, page range), next to the structured assertions they already\nmake. Delivered text is unchanged.\n\n* test(esp-image): assert structured facts and owned guidance\n\n* fix(esp-image): keep spi_flash_mode and descriptor fields before a truncated tail\n\nESP-IDF v6.1's esp_app_desc_t declares spi_flash_mode at byte 181, after\nmmu_page_size, as the committed reference layout shows; the descriptor now\nkeeps it as stored. The decoder also required all 256 descriptor bytes,\nthough it reads none past byte 181, so a file ending in the reserved tail\nlost the version, project, digest and revision facts it does hold. The app\ndescriptor now needs only its fields; the segment's truncation is reported\nas before.\n\n* test(esp-image): pin the P-192 public key digest to espsecure's layout\n\nespsecure packs ECDSA signature blocks as \"", + "parents": ["6c895eeb8e6b26bac1d551fc6660ee075a76fd6b"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7498] + }, + { + "sha": "251e27ef3bc8fbd9e6811c24d06ed4c18830eb1a", + "subject": "fix(website): align Electron guide with downloadable source (#7858)", + "body": "fix(website): align Electron guide with downloadable source (#7858)\n\n* fix(website): align Electron guide with downloadable source\n\n* test(website): detect renderer example drift", + "parents": ["64196b08cab9fab15649b6d0058f980cd3f733f6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7858] + }, + { + "sha": "dfa06898906920bbbedc9a2f21eb1f5ddd132fed", + "subject": "fix(process): preserve comparison uncertainty and attribution (#7853)", + "body": "fix(process): preserve comparison uncertainty and attribution (#7853)\n\n* fix(process): preserve comparison uncertainty and attribution\n\n* fix(process): retain known file differences with unknown effects\n\n* fix(process): preserve proven filesystem path differences\n\n* fix(process): preserve trace and symlink differences", + "parents": ["251e27ef3bc8fbd9e6811c24d06ed4c18830eb1a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7853] + }, + { + "sha": "7dbebb4e7db707e8b40b0d4932fa26dddc891ae2", + "subject": "fix(browser): preserve prefixed XHTML link hints (#7819)", + "body": "fix(browser): preserve prefixed XHTML link hints (#7819)", + "parents": ["dfa06898906920bbbedc9a2f21eb1f5ddd132fed"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7819] + }, + { + "sha": "af1ccb6506d17bbbecf76abb4ab5af2254220cab", + "subject": "fix(android): preserve manifest component spelling (#7818)", + "body": "fix(android): preserve manifest component spelling (#7818)", + "parents": ["7dbebb4e7db707e8b40b0d4932fa26dddc891ae2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7818] + }, + { + "sha": "a6295e433b7e141740ee1aeccd1c077952e77808", + "subject": "fix(python): preserve code objects after STORE_SLICE (#7815)", + "body": "fix(python): preserve code objects after STORE_SLICE (#7815)", + "parents": ["af1ccb6506d17bbbecf76abb4ab5af2254220cab"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7815] + }, + { + "sha": "4109271bcb3e283333be71b1410da7dd8456e150", + "subject": "fix(process)!: reject unsupported one-column terminals (#7848)", + "body": "fix(process)!: reject unsupported one-column terminals (#7848)\n\n* fix(process)!: reject unsupported one-column terminals\n\n* test(process): exercise actual two-column resize", + "parents": ["a6295e433b7e141740ee1aeccd1c077952e77808"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7848] + }, + { + "sha": "d49a1504ca20b8707200b66a161661d458920c1a", + "subject": "fix(erlang): respect legacy atom table layout (#7844)", + "body": "fix(erlang): respect legacy atom table layout (#7844)", + "parents": ["4109271bcb3e283333be71b1410da7dd8456e150"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7844] + }, + { + "sha": "b21a975faf6185ba2398571a57bd738fa869f7eb", + "subject": "fix(update): distinguish launcher failures from registry errors (#7843)", + "body": "fix(update): distinguish launcher failures from registry errors (#7843)", + "parents": ["d49a1504ca20b8707200b66a161661d458920c1a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7843] + }, + { + "sha": "685f6db960b208c88e86701438160e98b3603819", + "subject": "fix(browser): preserve unknown CDP source coordinates (#7842)", + "body": "fix(browser): preserve unknown CDP source coordinates (#7842)", + "parents": ["b21a975faf6185ba2398571a57bd738fa869f7eb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7842] + }, + { + "sha": "f9e7571a3d33ef654e396601e2f0e76dbc184ba8", + "subject": "feat(javascript): discover semantic call literals in feature traces (#7840)", + "body": "feat(javascript): discover semantic call literals in feature traces (#7840)\n\n* feat(javascript): discover semantic call literals in feature traces\n\n* fix(javascript): bound retained call literals by transfer capacity\n\n* test(javascript): align feature no-match diagnostic", + "parents": ["685f6db960b208c88e86701438160e98b3603819"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7840] + }, + { + "sha": "60ab4da329863ba7bf4530415d14efb05813cb87", + "subject": "fix(cli): correct completion options and setup guidance (#7851)", + "body": "fix(cli): correct completion options and setup guidance (#7851)\n\n* fix(cli): align MCP doctor completion with its options\n\n* fix(cli): explain zsh completion initialization\n\n* fix(cli): include launcher timing in doctor completion\n\n* style(cli): format doctor completion schema", + "parents": ["f9e7571a3d33ef654e396601e2f0e76dbc184ba8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7851] + }, + { + "sha": "477f63ae2155ec77562b04671baf6fff4d2eb6d3", + "subject": "fix(session)!: classify unavailable snapshot prerequisites (#7837)", + "body": "fix(session)!: classify unavailable snapshot prerequisites (#7837)\n\nfix(session): classify unavailable snapshot prerequisites", + "parents": ["60ab4da329863ba7bf4530415d14efb05813cb87"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7837] + }, + { + "sha": "aba158506b5b93ff31a720b01c7664b25abcefb1", + "subject": "fix(javascript): preserve repeated native resolver calls (#7824)", + "body": "fix(javascript): preserve repeated native resolver calls (#7824)", + "parents": ["477f63ae2155ec77562b04671baf6fff4d2eb6d3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7824] + }, + { + "sha": "aaf4d210688d12b0fc5d2f95c350d480511d6014", + "subject": "fix(source-map): clarify policy and evidence provenance (#7828)", + "body": "fix(source-map): clarify policy and evidence provenance (#7828)", + "parents": ["aba158506b5b93ff31a720b01c7664b25abcefb1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7828] + }, + { + "sha": "128c2cf632a6b104ec1f5f8f40dd3460f23a7889", + "subject": "fix(sqlite): report SQL statement resource allowance (#7829)", + "body": "fix(sqlite): report SQL statement resource allowance (#7829)", + "parents": ["aaf4d210688d12b0fc5d2f95c350d480511d6014"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7829] + }, + { + "sha": "e79ad6ca8ebbf2e96b5095e7c2b8bfaf27ca7559", + "subject": "fix(jeb): preserve selected endpoint in failures (#7835)", + "body": "fix(jeb): preserve selected endpoint in failures (#7835)\n\n* fix(jeb): preserve selected endpoint in failures\n\n* fix(jeb): retain endpoint on typed failures", + "parents": ["128c2cf632a6b104ec1f5f8f40dd3460f23a7889"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7835] + }, + { + "sha": "5bef2b48b6022d1e1599d775d900a920d6d4b730", + "subject": "fix(input)!: classify unresolvable source paths (#7847)", + "body": "fix(input)!: classify unresolvable source paths (#7847)", + "parents": ["e79ad6ca8ebbf2e96b5095e7c2b8bfaf27ca7559"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7847] + }, + { + "sha": "1e421242b97a533a5c03458ac074d4353ec17bf3", + "subject": "fix(javascript): preserve uncertainty for incomplete runtime captures (#7854)", + "body": "fix(javascript): preserve uncertainty for incomplete runtime captures (#7854)", + "parents": ["5bef2b48b6022d1e1599d775d900a920d6d4b730"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7854] + }, + { + "sha": "5119d08daf66aa290e63901f07884e527fab37cd", + "subject": "fix(web): preserve portable captured script paths (#7862)", + "body": "fix(web): preserve portable captured script paths (#7862)", + "parents": ["1e421242b97a533a5c03458ac074d4353ec17bf3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7862] + }, + { + "sha": "183e2e2d1ea05afca42ce5d73801951211859d96", + "subject": "fix(il2cpp): validate structural record extents (#7861)", + "body": "fix(il2cpp): validate structural record extents (#7861)", + "parents": ["5119d08daf66aa290e63901f07884e527fab37cd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7861] + }, + { + "sha": "0747e46401a4f5e487302dcc5061548b4634db5c", + "subject": "fix(cli): recognize integrity failures with partial observations (#7836)", + "body": "fix(cli): recognize integrity failures with partial observations (#7836)", + "parents": ["183e2e2d1ea05afca42ce5d73801951211859d96"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7836] + }, + { + "sha": "0a272d5cf5471f34eb0e686942357e27f2ee9507", + "subject": "fix(capture): bound preview headlines by source format (#7832)", + "body": "fix(capture): bound preview headlines by source format (#7832)\n\n* fix(capture): bound preview headlines by source format\n\n* test(capture): cover scalar HAR preview extensions", + "parents": ["0747e46401a4f5e487302dcc5061548b4634db5c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7832] + }, + { + "sha": "44331d04d20c538f20dfae9e2b64fcf34c5f7386", + "subject": "fix(browser): retain launch failure diagnostics (#7826)", + "body": "fix(browser): retain launch failure diagnostics (#7826)", + "parents": ["0a272d5cf5471f34eb0e686942357e27f2ee9507"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7826] + }, + { + "sha": "f19436c15661fa9365823733b545860737f6ad9e", + "subject": "fix(artifacts): split U-Boot script uImages on their size table (#7805)", + "body": "fix(artifacts): split U-Boot script uImages on their size table (#7805)\n\nU-Boot's mkimage writes the multi-file size table for script images\n(`mkimage -T script`, the boot.scr format) exactly as it does for multi\nimages, `mkimage -l` lists the script as \"Image 0\", and the `source`\ncommand skips the table before running the script (\"scripts are just\nmulti-image files with one component\", boot/image-board.c).\n\nThe uImage reader parsed the table only for IH_TYPE_MULTI, so a script\nimage reported sub_image_count 0 and exposed only payload.bin, whose\nfirst bytes are the binary size table rather than the script text.\n\nTreat IH_TYPE_SCRIPT like IH_TYPE_MULTI: parse the same bounded table,\nexpose image-.bin components and report the size-table limitation.\npayload.bin is unchanged. A script payload without a valid table now\nfails closed, as a multi image already does.", + "parents": ["44331d04d20c538f20dfae9e2b64fcf34c5f7386"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [7805] + }, + { + "sha": "19032204aacde0f6d36b2f55006bd0e51a43d54c", + "subject": "fix(javascript): resolve relative ESM backslash paths (#4323)", + "body": "fix(javascript): resolve relative ESM backslash paths (#4323)\n\nNormalize raw URL separators after admitting an original relative ESM\nrequest, before artifact path validation and root confinement. Preserve\nthe authored declaration and the existing encoded-separator checks.\n\nRetain Node-backed static and dynamic loader controls and compare the\napplication graph with the historical importer already present on main.\nNarrow PR #4323 to this remaining case after the upstream #4269 fix.\n\nSigned-off-by: Jiakai Xu ", + "parents": ["f19436c15661fa9365823733b545860737f6ad9e"], + "authors": [ + { + "name": "Jiakai Xu", + "email": "jiakaiPeanut@gmail.com", + "user": { + "login": "6eanut", + "__typename": "User" + } + } + ], + "pullRequests": [4323] + }, + { + "sha": "4b0ff68e2ecaad5b7a828bc9b0985099728c7b4b", + "subject": "fix(browser): retain prior-hop response facts in session timelines (#7807)", + "body": "fix(browser): retain prior-hop response facts in session timelines (#7807)\n\n* fix(browser): retain prior-hop response facts in session timelines\n\n* fix(browser): share response URL classification\n\n* fix(browser): preserve malformed response status failures\n\n* fix(browser): account for filtered redirect response coverage\n\n* test(browser): supply prior response URLs in redirect fixtures\n\n* fix(browser): retain malformed orphan response status coverage", + "parents": ["19032204aacde0f6d36b2f55006bd0e51a43d54c"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7807] + }, + { + "sha": "e23cb3b240c6af779f6dd75429dda515bbdbbdf4", + "subject": "fix(browser): preserve script exports with filesystem-unrepresentable paths (#7526)", + "body": "fix(browser): preserve script exports with filesystem-unrepresentable paths (#7526)\n\nfix(browser): isolate unrepresentable script export paths\n\nSigned-off-by: Rudy Celekli ", + "parents": ["4b0ff68e2ecaad5b7a828bc9b0985099728c7b4b"], + "authors": [ + { + "name": "Rudy Mizrahi Celekli", + "email": "47457359+rudycelekli@users.noreply.github.com", + "user": { + "login": "rudycelekli", + "__typename": "User" + } + } + ], + "pullRequests": [7526] + }, + { + "sha": "8f9af920efb39d22b5a915605403b67a1005bc0e", + "subject": "fix(pcap): redact HTTP credentials in failed capture diagnostics (#7871)", + "body": "fix(pcap): redact HTTP credentials in failed capture diagnostics (#7871)\n\nProject bounded JSON diagnostics using shared URI roles and source spans.\nKeep complete parser input unchanged and compute safe diagnostics lazily.\nPreserve byte facts, error classification, path data and cleanup ownership.\nReuse JSON escape-coordinate mapping with IDA diagnostics.\n\nFixes #7812\n\nAssisted-by: Reimu (gensokyo-skills:reimu-incident-triage)\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)\nAssisted-by: Yukari (gensokyo-skills:yukari-boundary-analysis)", + "parents": ["e23cb3b240c6af779f6dd75429dda515bbdbbdf4"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7871] + }, + { + "sha": "b75419b61e2e11760993b3e60046633e2532cbc4", + "subject": "test(firmware): keep producer fixtures within supported Node limits (#7048)", + "body": "test(firmware): keep producer fixtures within supported Node limits (#7048)\n\n* test(firmware): bound fixture hashing and avoid Node startup warnings\n\n* test(firmware): apply the Wasm flag only on Node 22", + "parents": ["8f9af920efb39d22b5a915605403b67a1005bc0e"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [7048] + }, + { + "sha": "2f3c71f39e5db7db5ea03a42e6a6eb89db8a91be", + "subject": "docs(errors): align byte entropy recovery catalog (#7884)", + "body": "docs(errors): align byte entropy recovery catalog (#7884)", + "parents": ["b75419b61e2e11760993b3e60046633e2532cbc4"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7884] + }, + { + "sha": "37827af5918a20b87698329a13d3705becdd6868", + "subject": "feat(artifacts): compare inventories from Evidence sources (#7869)", + "body": "feat(artifacts): compare inventories from Evidence sources (#7869)\n\n* feat(artifacts): compare artifacts by Evidence reference and from the CLI\n\ncompare_artifacts made agents send back the complete inventory Evidence\nthat REA already retains, and the CLI had no artifact comparison.\n\nEach side of compare_artifacts now takes exactly one of: complete inline\nEvidence (unchanged), {kind: \"retained-evidence\", evidence_id}, or\n{kind: \"evidence-file\", path, evidence_id?}. The two references are the\nsources inspect_analysis_view accepts; both tools now compose one\ndefinition in evidenceReference.ts. A summary still resolves to its exact\nretained parent, and every source form gives the same comparison Evidence.\nAn unresolvable retained reference is refused with a typed missing\nreference error.\n\nThe application layer owns source resolution and the comparison Evidence,\nso MCP and the new `rea compare-artifacts` command share one workflow.\nreadEvidenceFileSource reports bundle-selection refusals at the caller's\nown field path.\n\n* refactor(artifacts): resolve compare_artifacts sides like compare_functions\n\ncompare_functions, compare_wasm_interfaces and the JavaScript application\ncomparisons name each side with evidenceInputSchema and resolve it with\nresolvePairedEvidenceRequest. compare_artifacts reached the same result\nfor inline and retained sides through its own dispatch.\n\nevidenceSourceInputSchema now extends evidenceInputSchema with the\nEvidence-file reference, and resolvePairedEvidenceSources sends inline and\nretained sides to the same resolveEvidenceInput and file sides to the\nshared Evidence file reader. compare_artifacts uses both, so the forms it\nshares with compare_functions are parsed and resolved by one owner. The\nadvertised input schema is unchanged.\n\n* docs(cli): point rea compare to compare-artifacts for inventory contents\n\nrea compare (compare_bundles) compares records by Evidence identity and\nexplicit pairs and never reads artifact contents, so two build\ninventories stay unresolved there. Its help and the CLI guide now name\ncompare-artifacts for that comparison.\n\n* fix(artifacts): resolve summary parents within Evidence source bundles\n\n* perf(evidence): reuse file-owned immutable authentication proofs\n\n* test(evidence): inject failures at both authentication boundaries\n\n---------\n\nCo-authored-by: Entrpi ", + "parents": ["2f3c71f39e5db7db5ea03a42e6a6eb89db8a91be"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "Entrpi", + "email": "entrpi@proton.me", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [7869] + }, + { + "sha": "00bd92c56e59a868997b1dc2887310b8737f37b7", + "subject": "fix(ida): align workspace discovery with readiness (#7863)", + "body": "fix(ida): align workspace discovery with readiness (#7863)", + "parents": ["37827af5918a20b87698329a13d3705becdd6868"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7863] + }, + { + "sha": "fe52ea12c3828f6763f5da3ed168dec0dc5fdfb1", + "subject": "fix(evidence): explain fixed analysis view page recovery (#7860)", + "body": "fix(evidence): explain fixed analysis view page recovery (#7860)\n\n* fix(evidence): explain fixed analysis view page recovery\n\n* fix(evidence): explain unpublished view recovery", + "parents": ["00bd92c56e59a868997b1dc2887310b8737f37b7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7860] + }, + { + "sha": "1b636c890faa23a68099228bdbe1474ce212e357", + "subject": "fix(macho): retain inspection when vtool rejects universal container (#7865)", + "body": "fix(macho): retain inspection when vtool rejects universal container (#7865)\n\n* fix(macho): retain inspection when vtool rejects universal container\n\n* test(macho): assert facts retained after vtool refusal", + "parents": ["fe52ea12c3828f6763f5da3ed168dec0dc5fdfb1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7865] + }, + { + "sha": "46c457f74c474b224dd540d6eae6bc23080cd95f", + "subject": "docs(ghidra): fix DOL guide PowerPC link (#7857)", + "body": "docs(ghidra): fix DOL guide PowerPC link (#7857)", + "parents": ["1b636c890faa23a68099228bdbe1474ce212e357"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7857] + }, + { + "sha": "0759fb9ad5326fccc9130682e764c739377b47e3", + "subject": "fix(build): explain unsupported source loader runtimes (#7839)", + "body": "fix(build): explain unsupported source loader runtimes (#7839)", + "parents": ["46c457f74c474b224dd540d6eae6bc23080cd95f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7839] + }, + { + "sha": "9b7c2bb1ac00273469adf0021017fa7b9563dd8d", + "subject": "fix(javascript): retain anchored route constants under reserved prefixes (#7838)", + "body": "fix(javascript): retain anchored route constants under reserved prefixes (#7838)", + "parents": ["0759fb9ad5326fccc9130682e764c739377b47e3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7838] + }, + { + "sha": "5c60720ad726c6e8cf5f05399d791ee6a4632abf", + "subject": "fix(pe): distinguish bounded imphash name reads (#7830)", + "body": "fix(pe): distinguish bounded imphash name reads (#7830)", + "parents": ["9b7c2bb1ac00273469adf0021017fa7b9563dd8d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7830] + }, + { + "sha": "2dd9a3092e597bf05d0409a3c901b4e96b4ff310", + "subject": "fix(artifacts): extract readable inventoried entries (#7827)", + "body": "fix(artifacts): extract readable inventoried entries (#7827)\n\n* fix(artifacts): extract readable inventoried entries\n\n* test(artifacts): align directory omission coverage", + "parents": ["5c60720ad726c6e8cf5f05399d791ee6a4632abf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7827] + }, + { + "sha": "b0880d660feecaf9729b0bb69ce384e2b18a361e", + "subject": "fix(qlog): exclude hidden custom events from incomplete facts (#7825)", + "body": "fix(qlog): exclude hidden custom events from incomplete facts (#7825)", + "parents": ["2dd9a3092e597bf05d0409a3c901b4e96b4ff310"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7825] + }, + { + "sha": "bd687bbc40daf47d93f2b4c65b72004eb8f87c83", + "subject": "fix(ghidra)!: distinguish unlisted instruction addresses (#7823)", + "body": "fix(ghidra)!: distinguish unlisted instruction addresses (#7823)\n\n* fix(ghidra)!: distinguish unlisted instruction addresses\n\nBREAKING CHANGE: Ghidra now returns not-in-listing for in-memory addresses without listed instructions or defined data. Consumers matching the former undecodable value must handle the new status.\n\n* fix(ghidra): invalidate snapshots with old instruction status\n\n* test(ghidra): update raw profile commitment goldens", + "parents": ["b0880d660feecaf9729b0bb69ce384e2b18a361e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7823] + }, + { + "sha": "675c73fb4d3f33a17ab13e1fdfecdd4fc06f0cff", + "subject": "fix(apple): preserve post-table plist objects (#7820)", + "body": "fix(apple): preserve post-table plist objects (#7820)", + "parents": ["bd687bbc40daf47d93f2b4c65b72004eb8f87c83"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7820] + }, + { + "sha": "52617bd50e34726f490d5a458587685e7f9b2fb9", + "subject": "fix(model): recognize safetensors ZIP signature collisions (#7816)", + "body": "fix(model): recognize safetensors ZIP signature collisions (#7816)", + "parents": ["675c73fb4d3f33a17ab13e1fdfecdd4fc06f0cff"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7816] + }, + { + "sha": "78a350e0b67e48025dbffcd89559aee5dc9f150b", + "subject": "fix(skill): clarify packet capture tool selection (#7901)", + "body": "fix(skill): clarify packet capture tool selection (#7901)", + "parents": ["52617bd50e34726f490d5a458587685e7f9b2fb9"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7901] + }, + { + "sha": "e03ff939130b90c37dd15f70378a46dae19bbde8", + "subject": "fix(frida): retain selected discovery endpoint on failure (#7892)", + "body": "fix(frida): retain selected discovery endpoint on failure (#7892)", + "parents": ["78a350e0b67e48025dbffcd89559aee5dc9f150b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7892] + }, + { + "sha": "553f19590f55313e46fd859a7a9b55ff2d324f8f", + "subject": "fix(harmony): exclude symlinks from unavailable files (#7886)", + "body": "fix(harmony): exclude symlinks from unavailable files (#7886)", + "parents": ["e03ff939130b90c37dd15f70378a46dae19bbde8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7886] + }, + { + "sha": "5f146b3b1931755dbd0e6b34404bd526321f60e5", + "subject": "fix(ida): retain selected endpoint on connection failures (#7894)", + "body": "fix(ida): retain selected endpoint on connection failures (#7894)\n\n* fix(ida): retain selected endpoint on connection failures\n\n* fix(ida): redact encoded endpoint credentials and preserve causes", + "parents": ["553f19590f55313e46fd859a7a9b55ff2d324f8f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7894] + }, + { + "sha": "2aa0d45e1382435669fa82e97f839640f8699780", + "subject": "fix(mcp): guide oversized unknown recovery (#7876)", + "body": "fix(mcp): guide oversized unknown recovery (#7876)", + "parents": ["5f146b3b1931755dbd0e6b34404bd526321f60e5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7876] + }, + { + "sha": "f6380282fb8491782c665cf210846d541453704e", + "subject": "fix(web)!: retain invalid browser selection (#7903)", + "body": "fix(web)!: retain invalid browser selection (#7903)\n\nfix(web): retain invalid browser selection", + "parents": ["2aa0d45e1382435669fa82e97f839640f8699780"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7903] + }, + { + "sha": "583a316e118e9f82cbc036eb02fad1d5c8362e99", + "subject": "fix(macho): preserve POSIX app executable names (#7888)", + "body": "fix(macho): preserve POSIX app executable names (#7888)", + "parents": ["f6380282fb8491782c665cf210846d541453704e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7888] + }, + { + "sha": "114731eb1ed01507d63bde194cbb6073c2449c63", + "subject": "fix(process): retain uncertain cleanup ownership (#7845)", + "body": "fix(process): retain uncertain cleanup ownership (#7845)\n\n* fix(process): retain uncertain cleanup ownership\n\n* fix(process): retain moved members through cleanup retry\n\n* test(process): reconstruct ownership ledger in cleanup fixture", + "parents": ["583a316e118e9f82cbc036eb02fad1d5c8362e99"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7845] + }, + { + "sha": "6c76a7ffb0f9eff6c06d9090986a08fe25a9e1f2", + "subject": "fix(wasm): retain core facts with invalid custom names (#7822)", + "body": "fix(wasm): retain core facts with invalid custom names (#7822)\n\n* fix(wasm): retain core facts with invalid custom names\n\n* fix(wasm): retain objdump output on parse failure", + "parents": ["114731eb1ed01507d63bde194cbb6073c2449c63"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7822] + }, + { + "sha": "cc5a4062ff61b6b745775f83e53023a346ec4976", + "subject": "fix(browser): preserve unknown WebMCP comparison facts (#7833)", + "body": "fix(browser): preserve unknown WebMCP comparison facts (#7833)", + "parents": ["6c76a7ffb0f9eff6c06d9090986a08fe25a9e1f2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7833] + }, + { + "sha": "1e088c19adfb5d5123287a3defe5d63d579bba64", + "subject": "fix(environment)!: report recorded reads and target uncertainty (#7834)", + "body": "fix(environment)!: report recorded reads and target uncertainty (#7834)\n\n* fix(environment)!: report recorded reads and target uncertainty\n\nBREAKING CHANGE: Environment state and coverage can report method-replay for non-GET safe reads; exhaustive reason consumers must handle it.\n\n* docs(environment): include safe-method replay reason", + "parents": ["cc5a4062ff61b6b745775f83e53023a346ec4976"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7834] + }, + { + "sha": "4e663beeb8fc07496236a5aba8649910527a140b", + "subject": "fix(javascript): retain guards after labelled breaks (#7841)", + "body": "fix(javascript): retain guards after labelled breaks (#7841)\n\n* fix(javascript): retain guards after labelled breaks\n\n* fix(javascript): bound labelled exit inspection\n\n* fix(javascript): preserve local break completion\n\n* fix(javascript): avoid exits through unknown control flow\n\n* fix(javascript): retain guards after bounded jump scan", + "parents": ["1e088c19adfb5d5123287a3defe5d63d579bba64"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7841] + }, + { + "sha": "6c205d8a798d86db150dee7af1be2f69cbd948e3", + "subject": "fix(evidence): align bundle receipts and conflict recovery (#7849)", + "body": "fix(evidence): align bundle receipts and conflict recovery (#7849)", + "parents": ["4e663beeb8fc07496236a5aba8649910527a140b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7849] + }, + { + "sha": "29945d435d4642ba4d6ad673dec2bead4383cded", + "subject": "fix(process): preserve availability when macOS ownership preparation fails (#7856)", + "body": "fix(process): preserve availability when macOS ownership preparation fails (#7856)\n\n* fix(process): preserve availability when macOS ownership preparation fails\n\n* test(process): verify affected macOS provider availability", + "parents": ["6c205d8a798d86db150dee7af1be2f69cbd948e3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7856] + }, + { + "sha": "83cd1e04c93236b0338a98dfc7dedd94fadc81de", + "subject": "fix(javascript)!: report ambiguous artifact paths (#7864)", + "body": "fix(javascript)!: report ambiguous artifact paths (#7864)\n\n* fix(javascript): report ambiguous artifact paths\n\n* fix(javascript): retain unavailable colliding sources", + "parents": ["29945d435d4642ba4d6ad673dec2bead4383cded"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7864] + }, + { + "sha": "76c7698ac913e670b5fc1448be1d5a47a84c0973", + "subject": "fix(cli)!: preserve native value input diagnostics (#7889)", + "body": "fix(cli)!: preserve native value input diagnostics (#7889)", + "parents": ["83cd1e04c93236b0338a98dfc7dedd94fadc81de"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7889] + }, + { + "sha": "9b880e0e3ed14cf3229442aa347a47a8225b9157", + "subject": "fix(setup): report concurrent skill destination changes (#7898)", + "body": "fix(setup): report concurrent skill destination changes (#7898)\n\n* fix(setup): report concurrent skill destination changes\n\n* fix(setup): avoid rollback after exclusive link refusal", + "parents": ["76c7698ac913e670b5fc1448be1d5a47a84c0973"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7898] + }, + { + "sha": "f9acfdcf49790429f993f7c8166a0321def2de50", + "subject": "fix(cli): retain committed evidence receipts on output failure (#7906)", + "body": "fix(cli): retain committed evidence receipts on output failure (#7906)", + "parents": ["9b880e0e3ed14cf3229442aa347a47a8225b9157"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7906] + }, + { + "sha": "50d731d45615f30f50752de64513af0cea6d8312", + "subject": "fix(tests): remove duplicate MCP test imports", + "body": "fix(tests): remove duplicate MCP test imports\n", + "parents": ["f9acfdcf49790429f993f7c8166a0321def2de50"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "286629b570f10b3c655446234333e6f7dcbac7c3", + "subject": "fix(test): remove duplicate unknown session imports (#7917)", + "body": "fix(test): remove duplicate unknown session imports (#7917)", + "parents": ["50d731d45615f30f50752de64513af0cea6d8312"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7917] + }, + { + "sha": "21b192706d2d273baa9dd9de29c2afb77bd5955e", + "subject": "docs(website): correct client and IDA support guidance (#7918)", + "body": "docs(website): correct client and IDA support guidance (#7918)\n\n* docs(website): correct client and IDA support guidance\n\n* style(website): format setup support guidance", + "parents": ["286629b570f10b3c655446234333e6f7dcbac7c3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7918] + }, + { + "sha": "e0719cffa411a39af4c88868c4db653a8e5e28e7", + "subject": "fix(ledger): honor every selected fixture proof (#7931)", + "body": "fix(ledger): honor every selected fixture proof (#7931)\n\nPrevent a passing fixture entry from hiding applicable failures in another selected entry. Fixes #7412.", + "parents": ["21b192706d2d273baa9dd9de29c2afb77bd5955e"], + "authors": [ + { + "name": "Hasan Zayni", + "email": "36798269+dark13b@users.noreply.github.com", + "user": { + "login": "dark13b", + "__typename": "User" + } + } + ], + "pullRequests": [7931] + }, + { + "sha": "31c028f4962e1f2a3a6fdd45406b5010ed5cf01d", + "subject": "fix(mcp): align retained view handoff guidance (#7926)", + "body": "fix(mcp): align retained view handoff guidance (#7926)", + "parents": ["e0719cffa411a39af4c88868c4db653a8e5e28e7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7926] + }, + { + "sha": "5082b50f074e2f3e1ba5534d119ae16566673a36", + "subject": "fix(decompile): retain limitations across failed resume (#7913)", + "body": "fix(decompile): retain limitations across failed resume (#7913)", + "parents": ["31c028f4962e1f2a3a6fdd45406b5010ed5cf01d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7913] + }, + { + "sha": "473cfa36b8ae62c82500ce7b8dbfccc3cae3488e", + "subject": "fix(evidence)!: distinguish inline records from bundles (#7895)", + "body": "fix(evidence)!: distinguish inline records from bundles (#7895)\n\n* fix(evidence): distinguish inline records from bundles\n\n* fix(evidence): preserve bundle integrity failure reasons", + "parents": ["5082b50f074e2f3e1ba5534d119ae16566673a36"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7895] + }, + { + "sha": "16cfe30dabd3235cc22a6fa62d8d4c33d0b7e511", + "subject": "fix(setup): identify invalid launch environment overrides (#7899)", + "body": "fix(setup): identify invalid launch environment overrides (#7899)\n\n* fix(setup): identify invalid launch environment overrides\n\n* test(setup): cover merged environment recovery", + "parents": ["473cfa36b8ae62c82500ce7b8dbfccc3cae3488e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7899] + }, + { + "sha": "fd297b1b171e2fe829f07385e59cffc57ff41d12", + "subject": "fix(apple): preserve bounded archive diagnostics (#7890)", + "body": "fix(apple): preserve bounded archive diagnostics (#7890)\n\n* fix(apple): preserve bounded archive diagnostics\n\n* test(apple): assert diagnostic facts without freezing prose", + "parents": ["16cfe30dabd3235cc22a6fa62d8d4c33d0b7e511"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7890] + }, + { + "sha": "8c83886891c1749db3442c7099f6a9dea8f26755", + "subject": "fix(pe): report exhausted certificate decoder allowances as resource limits (#7881)", + "body": "fix(pe): report exhausted certificate decoder allowances as resource limits (#7881)\n\n* fix(pe): report exhausted certificate decoder allowances as resource limits\n\nA PKCS#7 payload that exhausted the fixed 64 KiB decoded-text or 16,384-value ASN.1 allowance was refused as malformed input with advice to correct request fields. Keep the allowance and limit on the decoder failure and report it as a nonretryable resource_constraint with fixed-allowance recovery.\n\nFixes #7531\n\n* test(pe): cover certificate allowances through MCP\n\n---------\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["fd297b1b171e2fe829f07385e59cffc57ff41d12"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7881] + }, + { + "sha": "a0012312564a5b96c7e12d70c554c3b5029faefc", + "subject": "fix(adb)!: report local filesystem admission failures (#7885)", + "body": "fix(adb)!: report local filesystem admission failures (#7885)\n\n* fix(adb)!: report local filesystem admission failures\n\n* test(adb): assert filesystem error provenance", + "parents": ["8c83886891c1749db3442c7099f6a9dea8f26755"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7885] + }, + { + "sha": "c2cc7e6eb0979303ae78c7146b2705b7181e8dd6", + "subject": "test(cli): cover literal Markdown heading output (#7866)", + "body": "test(cli): cover literal Markdown heading output (#7866)", + "parents": ["a0012312564a5b96c7e12d70c554c3b5029faefc"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7866] + }, + { + "sha": "9ac9f91ab579d562950cc3ac8590ea097fa6f121", + "subject": "fix(firmware): validate Intel HEX start-record offsets (#7806)", + "body": "fix(firmware): validate Intel HEX start-record offsets (#7806)", + "parents": ["c2cc7e6eb0979303ae78c7146b2705b7181e8dd6"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7806] + }, + { + "sha": "b4923f85c5dcfef80fe18483a0511f6c1ba59ef4", + "subject": "docs(ghidra): count 27 read-only operations in current guides (#7794)", + "body": "docs(ghidra): count 27 read-only operations in current guides (#7794)\n\nThe inventory registry gained read_binary_inventory_summary, so the\nread-only inventory is fifteen inventory and twelve function operations.\nUpdate the adapter summary and the Windows lane descriptions to match the\nregistries the Windows verifier derives its coverage from. The historical\nWindows verification record keeps its observed 26-operation count.\n\nFixes #7611", + "parents": ["9ac9f91ab579d562950cc3ac8590ea097fa6f121"], + "authors": [ + { + "name": "PARK HYEONMIN (박현민)", + "email": "b01080080329@gmail.com", + "user": { + "login": "Sean-mn", + "__typename": "User" + } + } + ], + "pullRequests": [7794] + }, + { + "sha": "edc908af582d757e427c55eafe1a02fa0c42c0eb", + "subject": "fix(xml): reject ambiguous namespace attribute identities (#7785)", + "body": "fix(xml): reject ambiguous namespace attribute identities (#7785)", + "parents": ["b4923f85c5dcfef80fe18483a0511f6c1ba59ef4"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7785] + }, + { + "sha": "fc24b08851f32eb7d42733ef5c786840d31a4d5f", + "subject": "feat(artifacts): read Zstandard ZIP members (#7780)", + "body": "feat(artifacts): read Zstandard ZIP members (#7780)\n\n* feat(artifacts): read Zstandard-compressed ZIP members\n\n* fix(artifacts): classify ZIP dictionary failures\n\n---------\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["edc908af582d757e427c55eafe1a02fa0c42c0eb"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7780] + }, + { + "sha": "3142f7b0dd91a07c7fe7989a4295cfe5d929682a", + "subject": "fix(adb): align CLI selector schemas with canonical inputs (#7722)", + "body": "fix(adb): align CLI selector schemas with canonical inputs (#7722)\n\n* fix(adb): align CLI selector schemas with canonical inputs\n\nReuse canonical selector constraints for ADB CLI admission and cover schema, parser, and inert provider boundaries. Independent source review approved tree bc722f8d1b1f8d014be29533e6845c6f897d5918; full contribution checks remain pending.\n\n* test(adb): expect CLI serial validation refusal\n\nIndependent review approved staged diff 35418e6994339af838b490be51278fd41b9f8e3e. Focused serial refusal test, lint, and formatting passed with existing dependencies.\n\n* test(adb): assert CLI selector validation stage\n\nIndependent review approved staged diff a1164a8dcf1df1f0d60323d7a53a69ee2bfdffeb. Focused dispatch tests, targeted lint and formatting passed using existing dependencies.\n\n* fix(adb): retain safe selector validation constraints\n\nIndependent review: review_ci_delta APPROVE for diff 18748a3b4b112dc96b95f7c1099bd479e1d1587b. Focused tests, typecheck and targeted lint passed; the aggregate check remains limited by a matching baseline Knip finding.", + "parents": ["fc24b08851f32eb7d42733ef5c786840d31a4d5f"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7722] + }, + { + "sha": "f1da7f7670d8e6763ed447a329820cad1d61f35f", + "subject": "fix(javascript): read the spawn env option as Node reads it (#7713)", + "body": "fix(javascript): read the spawn env option as Node reads it (#7713)\n\n* fix(javascript): read spawn env as Node reads it\n\nNode's normalizeSpawnArguments starts with `const env = options.env ||\n{ ...process.env }`, so a falsy env is replaced by a copy of the parent\nenvironment. A child started with env: null, undefined, 0, \"\" or false\ntherefore inherits everything, exactly as if no env were passed.\n\nREA tested the key's presence alone, so every one of those reported\nenvironment_supplied: true and the graph emitted a resolved supplies-env\nrelation. The presence test also missed the opposite direction: an env\nsupplied through an inline object spread reported false although Node uses\nit.\n\nRead the declared value the way stdioMode already reads stdio: an explicit\nproperty whose statically known value is falsy does not supply an\nenvironment, and an inline spread that carries env does.\n\nVerified on Node v24.22.1 with a child that prints a parent marker variable:\nno options, env: null, undefined, void 0, 0, \"\" and false all print the\nmarker, while env: {} prints nothing and env: { A: \"1\" } prints only that.\n\n* fix(javascript): read falsy numeric literals as Node does\n\ngreptile flagged that environmentSupplied still reported a supplied environment for\n`env: -0` and `env: 0n`: staticJavaScriptTruthiness recognized neither form, so it\nreturned undefined and `!== false` turned that into true. Node's\nnormalizeSpawnArguments uses `options.env || { ...process.env }`, so both inherit.\n\nExtend the shared truthiness reader to cover a BigInt literal and a negated numeric\nliteral, and add regression cases for `-0`, `0n` and `0.0`.\n\nThe reader is shared with the route scan and the state tracker; both treat\n`undefined` as \"unknown\", so a more precise `false` only strengthens them.", + "parents": ["3142f7b0dd91a07c7fe7989a4295cfe5d929682a"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [7713] + }, + { + "sha": "07dfd12613175af467ac86312a9d802b7ac36bac", + "subject": "fix(pe): reject non-MZ inputs before image inspection (#7709)", + "body": "fix(pe): reject non-MZ inputs before image inspection (#7709)\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>", + "parents": ["f1da7f7670d8e6763ed447a329820cad1d61f35f"], + "authors": [ + { + "name": "hhang", + "email": "17309584214@163.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + } + ], + "pullRequests": [7709] + }, + { + "sha": "42d5425417a9e57923b65f398ca07852165bf02d", + "subject": "fix(browser): enforce initial navigation default deadline (#7934)", + "body": "fix(browser): enforce initial navigation default deadline (#7934)", + "parents": ["07dfd12613175af467ac86312a9d802b7ac36bac"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7934] + }, + { + "sha": "1631dcb09a34380f36b34e217efe4e98d96b203f", + "subject": "docs: include Kuna in native provider guidance (#7929)", + "body": "docs: include Kuna in native provider guidance (#7929)\n\n* docs: include Kuna in native provider guidance\n\n* docs(i18n): include Kuna in native provider guidance\n\n* docs: align provider guide links\n\n* Update README.md\n\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>\n\n* docs: align provider links and translated formatting\n\n---------\n\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>", + "parents": ["42d5425417a9e57923b65f398ca07852165bf02d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "greptile-apps[bot]", + "email": "165735046+greptile-apps[bot]@users.noreply.github.com", + "user": { + "login": "greptile-apps[bot]", + "__typename": "User" + } + } + ], + "pullRequests": [7929] + }, + { + "sha": "66f5b650d9421f06607e79ebeed450037697dbe1", + "subject": "fix(apk): explain unknown signer comparison (#7927)", + "body": "fix(apk): explain unknown signer comparison (#7927)", + "parents": ["1631dcb09a34380f36b34e217efe4e98d96b203f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7927] + }, + { + "sha": "a4bd924772fdee0c7fe999ebf6e0e9904b58f3e3", + "subject": "fix(call-path): reject incompatible coordinate mappings (#7930)", + "body": "fix(call-path): reject incompatible coordinate mappings (#7930)\n\n* fix(call-path): reject incompatible coordinate mappings\n\nUse the existing provider-owned coordinate context comparison before composing dossiers. Preserve same-mapping profiles and missing-dossier uncertainty. Fixes #7345.\n\n* test(call-path): assert the structured rejection instead of its wording\n\ndocs/testing.md asks for structured error checks. Assert the issue path and reason, and keep the MCP category and code.", + "parents": ["66f5b650d9421f06607e79ebeed450037697dbe1"], + "authors": [ + { + "name": "Hasan Zayni", + "email": "36798269+dark13b@users.noreply.github.com", + "user": { + "login": "dark13b", + "__typename": "User" + } + } + ], + "pullRequests": [7930] + }, + { + "sha": "63491645fd007e3b71a63c05c5dd0ea937b2ee9b", + "subject": "fix(ledger): withhold readiness for unresolved evidence (#7928)", + "body": "fix(ledger): withhold readiness for unresolved evidence (#7928)", + "parents": ["a4bd924772fdee0c7fe999ebf6e0e9904b58f3e3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7928] + }, + { + "sha": "f256492ff3b754a6cb34c14d5b484193cd21f32c", + "subject": "fix(apple): recognize AppKit cell ownership (#7916)", + "body": "fix(apple): recognize AppKit cell ownership (#7916)", + "parents": ["63491645fd007e3b71a63c05c5dd0ea937b2ee9b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7916] + }, + { + "sha": "9b4546276c72b310bb22077576dcd62b348b0251", + "subject": "fix(browser): preserve frame tree root identity (#7915)", + "body": "fix(browser): preserve frame tree root identity (#7915)", + "parents": ["f256492ff3b754a6cb34c14d5b484193cd21f32c"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7915] + }, + { + "sha": "086abf3996404c395c31d78ec674350ef569da1a", + "subject": "fix(javascript): distinguish bundled script locations (#7909)", + "body": "fix(javascript): distinguish bundled script locations (#7909)", + "parents": ["9b4546276c72b310bb22077576dcd62b348b0251"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7909] + }, + { + "sha": "844bb463512bca125fd7f675e378366ebd148c60", + "subject": "fix(javascript): retain Electron switch conditions (#7910)", + "body": "fix(javascript): retain Electron switch conditions (#7910)\n\n* fix(javascript): retain Electron switch conditions\n\n* fix(javascript): bound switch path traversal", + "parents": ["086abf3996404c395c31d78ec674350ef569da1a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7910] + }, + { + "sha": "32b3722d2ffab1200122d441ec4af9117ea9c77b", + "subject": "fix(ghidra): report unusable existing-project selections as REA_GHIDRA_PROJECT_PATH configuration errors (#7922)", + "body": "fix(ghidra): report unusable existing-project selections as REA_GHIDRA_PROJECT_PATH configuration errors (#7922)\n\nA selected .gpr marker that does not exist and a target that existing-project mode cannot serve both surfaced as execution_failure with no setting and a doctor action that cannot help. Both now return configuration_invalid naming REA_GHIDRA_PROJECT_PATH. The ENOENT diagnostic of the missing marker is kept.\n\nFixes #7417\nFixes #7416", + "parents": ["844bb463512bca125fd7f675e378366ebd148c60"], + "authors": [ + { + "name": "Hasan Zayni", + "email": "36798269+dark13b@users.noreply.github.com", + "user": { + "login": "dark13b", + "__typename": "User" + } + } + ], + "pullRequests": [7922] + }, + { + "sha": "bbd4989654f9d68783ca425ec3b2844f3ce77e22", + "subject": "fix(config): treat a blank analyzer override as absent beside an existing Ghidra project (#7923)", + "body": "fix(config): treat a blank analyzer override as absent beside an existing Ghidra project (#7923)\n\nREA_GHIDRA_DISABLED_ANALYZERS parses a blank or comma-only value to no override, but the existing-project conflict check tested the raw value. MCP startup exited and doctor reported config_drift for an input that selects nothing. The check now uses the parsed value.\n\nFixes #7422", + "parents": ["32b3722d2ffab1200122d441ec4af9117ea9c77b"], + "authors": [ + { + "name": "Hasan Zayni", + "email": "36798269+dark13b@users.noreply.github.com", + "user": { + "login": "dark13b", + "__typename": "User" + } + } + ], + "pullRequests": [7923] + }, + { + "sha": "0179d9442023f0457b05577bbbd3bdc46236046a", + "subject": "fix(browser): disclose opaque redirect coverage gaps (#7943)", + "body": "fix(browser): disclose opaque redirect coverage gaps (#7943)", + "parents": ["bbd4989654f9d68783ca425ec3b2844f3ce77e22"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7943] + }, + { + "sha": "2129c17925d14e4f4de5fc6a54b705470ac7c0e8", + "subject": "fix(native): retain selected Mach-O slice identity (#7940)", + "body": "fix(native): retain selected Mach-O slice identity (#7940)", + "parents": ["0179d9442023f0457b05577bbbd3bdc46236046a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7940] + }, + { + "sha": "794907fa3da5e231adde1e2811841fe099bd6a61", + "subject": "fix(javascript): trace boundary results to assigned bindings (#7912)", + "body": "fix(javascript): trace boundary results to assigned bindings (#7912)", + "parents": ["2129c17925d14e4f4de5fc6a54b705470ac7c0e8"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7912] + }, + { + "sha": "3a512303d956931608d66bece4b8e858bca1fcea", + "subject": "fix(cli)!: refuse lossy text output (#7852)", + "body": "fix(cli)!: refuse lossy text output (#7852)\n\n* fix(cli)!: refuse lossy text output\n\n* fix(cli): retain failure identity on text refusal\n\n* fix(cli): check failed TOON token windows\n\n* test(cli): bound keyed archive case duration", + "parents": ["794907fa3da5e231adde1e2811841fe099bd6a61"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7852] + }, + { + "sha": "b0b25ad93e49b3660c44f7a11ff2dcbb0aa0c7eb", + "subject": "fix(ida): report registration timeout bounds (#7893)", + "body": "fix(ida): report registration timeout bounds (#7893)", + "parents": ["3a512303d956931608d66bece4b8e858bca1fcea"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7893] + }, + { + "sha": "c7722c8eebea60ce3399961bc63b226f59876edd", + "subject": "fix(cli): honor token controls for builtin documents (#7897)", + "body": "fix(cli): honor token controls for builtin documents (#7897)", + "parents": ["b0b25ad93e49b3660c44f7a11ff2dcbb0aa0c7eb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7897] + }, + { + "sha": "5147b6e3068c262a49da0389b1c10f3e8d0b6f62", + "subject": "fix(environment)!: attribute source errors to caller fields (#7900)", + "body": "fix(environment)!: attribute source errors to caller fields (#7900)\n\n* fix(environment): attribute source file errors to caller fields\n\n* style(environment): format source admission tests", + "parents": ["c7722c8eebea60ce3399961bc63b226f59876edd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7900] + }, + { + "sha": "ef9ab91e42c5e2c42d3f5d82150e5ef24a74e2d1", + "subject": "fix(il2cpp): validate retained declaring type relationships (#7946)", + "body": "fix(il2cpp): validate retained declaring type relationships (#7946)", + "parents": ["5147b6e3068c262a49da0389b1c10f3e8d0b6f62"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7946] + }, + { + "sha": "7c5700542ec37756f0974b54b0246c01e397dfa0", + "subject": "test(reference): pin excluded package main resolution (#7941)", + "body": "test(reference): pin excluded package main resolution (#7941)", + "parents": ["ef9ab91e42c5e2c42d3f5d82150e5ef24a74e2d1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7941] + }, + { + "sha": "3a46047aa787ab07ffa59fde88c88a13a2554390", + "subject": "fix(pe): reject surrogate code units in BMPString names (#7817)", + "body": "fix(pe): reject surrogate code units in BMPString names (#7817)\n\n* fix(pe): reject surrogate code units in BMPString names\n\n* chore: preserve base browser imports\n\n---------\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["7c5700542ec37756f0974b54b0246c01e397dfa0"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7817] + }, + { + "sha": "30936d7596303dc77a6532aefd67ec1de4d81b0d", + "subject": "fix(managed): report member signature issues at artifact offsets (#7879)", + "body": "fix(managed): report member signature issues at artifact offsets (#7879)\n\nField, MethodDef and MemberRef signature issues reported the invalid operand's offset inside its blob, while local signature issues in the same coverage array used artifact file offsets. Translate both through one helper that adds the blob's artifact base.\n\nFixes #7385", + "parents": ["3a46047aa787ab07ffa59fde88c88a13a2554390"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [7879] + }, + { + "sha": "64d282b0a6dec6c87215fa3d32e5eb5425297e56", + "subject": "fix(process): normalize descendants of slash-spelled directory roots (#7803)", + "body": "fix(process): normalize descendants of slash-spelled directory roots (#7803)\n\n* fix(process): normalize descendants of slash-spelled directory roots\n\nA working directory or observation path ending in / or /. kept its\ntrailing separator as the alias, so descendant paths never met the\ndelimiter lookahead and stayed literal. Strip those spellings before\nbuilding aliases and version the path normalization contract as v3.\n\nFixes #7584\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(process): normalize filesystem root descendants\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["30936d7596303dc77a6532aefd67ec1de4d81b0d"], + "authors": [ + { + "name": "HawkForge", + "email": "75696486+HawkForge@users.noreply.github.com", + "user": { + "login": "HawkForge", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7803] + }, + { + "sha": "a965cbab06fcdecc6918e77e4d299ea91e8ef41c", + "subject": "fix(ghidra): omit duplicate load-image result (#7777)", + "body": "fix(ghidra): omit duplicate load-image result (#7777)\n\n* fix(ghidra): omit duplicate load-image result\n\n* docs(mcp): describe load-image evidence projection", + "parents": ["64d282b0a6dec6c87215fa3d32e5eb5425297e56"], + "authors": [ + { + "name": "Ha1baraA1", + "email": "243105435+Ha1baraA11@users.noreply.github.com", + "user": { + "login": "Ha1baraA11", + "__typename": "User" + } + } + ], + "pullRequests": [7777] + }, + { + "sha": "b7442c19583a569d79d0c7fc61635e34d84c8626", + "subject": "fix(javascript): match resource release methods to the acquired handle (#7773)", + "body": "fix(javascript): match resource release methods to the acquired handle (#7773)\n\n* fix(javascript): match resource release methods to the acquired handle\n\nEvery acquisition family admitted every release method, so `h.close()`,\n`h.destroy()` and `h.end()` each resolved as a complete release of whatever the\nbinding held. Node exposes a different subset per acquisition, and the rejected\npairs throw at the call site instead.\n\nMeasured on Node 24.22.1:\n\n| acquisition | value | release members |\n| --- | --- | --- |\n| `fs.openSync` | number | none |\n| `fs.open` (callback) | undefined | none |\n| `fs.createReadStream` | ReadStream | `close`, `destroy` (`end` is the byte-offset field) |\n| `fs.createWriteStream` | WriteStream | `close`, `destroy`, `end` |\n| `fs/promises.open` | FileHandle | `close` |\n| `net.connect` | Socket | `destroy`, `end` |\n| `tls.connect` | TLSSocket | `destroy`, `end` |\n\nSo `fs.openSync(...)` + `fd.close()`, `createReadStream(...)` + `.end()`,\n`net.connect(...)` + `.close()` and the FileHandle cases emitted a `releases` /\n`resolved` fact for a call that throws.\n\nCarry the specifier with each acquisition candidate, list the release methods\neach pair actually has, and emit no release when the pair is not one of them. A\nrelease stays `complete` only when the binding held exactly one acquisition and\nthat acquisition admitted the method.\n\n`tls.createConnection` is not a Node export at all: `'createConnection' in\nrequire('node:tls')` is false and the ESM import does not link. Drop it from the\ntable so a `tls.createConnection` call yields no acquisition.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* fix(javascript): cover a mixed-family binding before completing a release\n\ngreptile asked for the mixed-family case: a binding that can hold either a\nFileHandle or a socket, then calls close(). The FileHandle is the only linked\nacquisition and the release stays partial.\n\nThat case also showed the `candidates.length === 1` guard was dead: an\nacquisition of another family is not in `linked`, so `holdsOnlyAcquisitions`\nalready returns false for it and the release already stayed partial without the\nguard. Removing the guard and keeping the test means the behaviour is now pinned\nby a test rather than by two overlapping conditions.", + "parents": ["a965cbab06fcdecc6918e77e4d299ea91e8ef41c"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [7773] + }, + { + "sha": "4671947c97bb661b3507b7691f57227a2757a44f", + "subject": "test(firmware): pin the staging ceiling at the request boundary (#7775)", + "body": "test(firmware): pin the staging ceiling at the request boundary (#7775)\n\n* test(firmware): exercise the staging ceiling through the emitted refusal\n\nThe ceiling recovery added in #6971 was covered through the wording helper only, so a wiring change that passed the schema ceiling where the selected value belongs, or that dropped the remediation, would have stayed green.\n\nAdds boundary coverage that calls inventoryFirmwareOutput itself: a sparse file reaches the real byte ceiling without storing the bytes and asserts the projected refusal carries the ceiling recovery, and a one-byte tree below the ceiling asserts the raise advice. Verified red on both regressions — passing the schema ceiling for the selected value fails the below-ceiling case, and restoring the single-form remediation fails both.\n\n* test(firmware): compare the emitted recovery with its owner\n\nThe wiring test matched three phrases of the emitted remediation, so an ad-hoc or truncated action that kept those phrases would still pass while the emitted recovery had diverged from firmwareStagingBudgetRemediation.\n\nAssert exact equality with the owner's output for the selected value in both cases instead. Verified red: replacing the emitted action with a divergent sentence that keeps the ceiling phrases now fails both cases, where the phrase matching passed.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* test(firmware): drive the staging ceiling through the request boundary\n\ngreptile and codex both flagged that the ceiling tests called\ninventoryFirmwareOutput directly, so they would still pass if request parsing or\nthe provider wiring dropped or replaced max_output_bytes.\n\nAdd a request-level test that records the parsed request a provider receives:\nthe caller's max_output_bytes arrives unchanged at the schema ceiling and below\nit, the documented default applies when omitted, and a budget above the schema\nmaximum is rejected before the provider runs. That is the wiring the previous\ntests assumed rather than asserted.", + "parents": ["b7442c19583a569d79d0c7fc61635e34d84c8626"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [7775] + }, + { + "sha": "6db024dc963abf90472346e5097e02e13a5b4ccd", + "subject": "fix(cli): reject empty native and managed targets before resolution (#7956)", + "body": "fix(cli): reject empty native and managed targets before resolution (#7956)\n\nLocal file commands in the core binary, native, managed and native-tool\nCLI groups declared their positional target as a plain string. An empty\nargument therefore reached path admission, where it resolved to the\nworking directory, as docs/cli.md says it never should.\n\nDeclare those targets with the shared nonempty, NUL-free local path\nschema already used by analyze, so the CLI rejects them as a\nVALIDATION_ERROR naming the field before any analysis runner is called.\nExplicit \".\" is unchanged.\n\nFixes #7436\nFixes #7404", + "parents": ["4671947c97bb661b3507b7691f57227a2757a44f"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [7956] + }, + { + "sha": "640e19d79d13c8aa767909cdbac64556f6879f46", + "subject": "fix(native)!: own Mach-O load commands in binary reader (#7952)", + "body": "fix(native)!: own Mach-O load commands in binary reader (#7952)\n\n* fix(native): retain selected Mach-O slice identity\n\n* fix(native)!: own Mach-O load commands in binary reader\n\n* fix(native): preserve malformed Mach-O and image base limits\n\n* fix(native): preserve leading BOM in Mach-O names\n\n* test(native): update Mach-O provenance verification\n\n* fix(native): retain completed Mach-O inspection on cleanup failure\n\n* fix: bound Mach-O projected section output\n\n* fix(native): own retained Mach-O command bytes\n\n* fix(native): retain Mach-O outcomes on final cancellation\n\n* fix(cli): preserve caller path in partial evidence\n\n* fix: reserve Mach-O projection envelope budget", + "parents": ["6db024dc963abf90472346e5097e02e13a5b4ccd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7952] + }, + { + "sha": "0448f318e6f713a2b61fb226dd1e411568c84a61", + "subject": "fix(outputs): use neutral destination diagnostics (#7949)", + "body": "fix(outputs): use neutral destination diagnostics (#7949)", + "parents": ["640e19d79d13c8aa767909cdbac64556f6879f46"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7949] + }, + { + "sha": "c92322b473742628eecb4d13bd467a195fa3126e", + "subject": "fix(process): await Swift frontend lifetime pipe (#7948)", + "body": "fix(process): await Swift frontend lifetime pipe (#7948)", + "parents": ["0448f318e6f713a2b61fb226dd1e411568c84a61"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7948] + }, + { + "sha": "0386efd1e1dfa41af41f804a6be56c6f5b7615d4", + "subject": "fix(pcap): retain producer contradiction diagnostics (#7937)", + "body": "fix(pcap): retain producer contradiction diagnostics (#7937)\n\n* fix(pcap): retain producer contradiction diagnostics\n\n* test(pcap): align DNS fixture with empty captures", + "parents": ["c92322b473742628eecb4d13bd467a195fa3126e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7937] + }, + { + "sha": "33d697574928fa8ce225b094fea69a791ba4ee18", + "subject": "fix(certificates)!: disclose undecoded unsigned attributes (#7920)", + "body": "fix(certificates)!: disclose undecoded unsigned attributes (#7920)\n\n* fix(certificates): disclose undecoded unsigned attributes\n\n* test(certificates): use parser-owned limitation text", + "parents": ["0386efd1e1dfa41af41f804a6be56c6f5b7615d4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7920] + }, + { + "sha": "9e1a1e700ad9a84fa6a49ecc7abd8b38918b2154", + "subject": "fix(cli): prevent mcp discovery from registering clients (#7919)", + "body": "fix(cli): prevent mcp discovery from registering clients (#7919)\n\n* fix(cli): prevent mcp discovery from registering clients\n\n* fix(cli): use shared output parsing for discovery errors", + "parents": ["33d697574928fa8ce225b094fea69a791ba4ee18"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7919] + }, + { + "sha": "70a8325c38f44649898b2343aea4c13588ff0352", + "subject": "fix(setup): preserve existing configuration mode (#7942)", + "body": "fix(setup): preserve existing configuration mode (#7942)", + "parents": ["9e1a1e700ad9a84fa6a49ecc7abd8b38918b2154"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7942] + }, + { + "sha": "3536ea2f49e0c78cac8f4e5bb6a40ce8a8a929bf", + "subject": "fix(discovery): report debugger start host restrictions (#7965)", + "body": "fix(discovery): report debugger start host restrictions (#7965)", + "parents": ["70a8325c38f44649898b2343aea4c13588ff0352"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7965] + }, + { + "sha": "59a895a19316bb86588cb00bfd5230f7979cc1a1", + "subject": "fix(electron): retain unknown external module ownership (#7950)", + "body": "fix(electron): retain unknown external module ownership (#7950)", + "parents": ["3536ea2f49e0c78cac8f4e5bb6a40ce8a8a929bf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7950] + }, + { + "sha": "78a1e1956e817f26d6e66dd06da211bf71483040", + "subject": "fix(pcap): validate selected resource limiter before capture (#7947)", + "body": "fix(pcap): validate selected resource limiter before capture (#7947)\n\n* fix(pcap): validate selected resource limiter before capture\n\n* fix(pcap): verify limiter capabilities and preserve probe output", + "parents": ["59a895a19316bb86588cb00bfd5230f7979cc1a1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7947] + }, + { + "sha": "611c30cb2036960341a0d07702ef35408cc55f5b", + "subject": "fix(browser): deduplicate scenario coverage guidance (#7933)", + "body": "fix(browser): deduplicate scenario coverage guidance (#7933)\n\n* fix(browser): deduplicate scenario coverage guidance\n\n* style(tests): fix CI formatting", + "parents": ["78a1e1956e817f26d6e66dd06da211bf71483040"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7933] + }, + { + "sha": "95f062578116a90b74d7f3c30e861074cadaa677", + "subject": "fix(javascript): preserve uncertain with-scope member writes (#7914)", + "body": "fix(javascript): preserve uncertain with-scope member writes (#7914)\n\n* fix(javascript): preserve uncertain with-scope member writes\n\n* fix: retain nested initializer candidates\n\n* fix(javascript): admit initializer values in worker transport\n\n* fix(tests): remove duplicate MCP test imports", + "parents": ["611c30cb2036960341a0d07702ef35408cc55f5b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7914] + }, + { + "sha": "63f05d1cad5784b7f4e8a5647c597b95ab5253e3", + "subject": "fix(javascript): preserve uncertainty for unexamined sources (#7911)", + "body": "fix(javascript): preserve uncertainty for unexamined sources (#7911)\n\n* fix(javascript): preserve uncertainty for unexamined sources\n\n* fix(javascript): compare observed package parsing status", + "parents": ["95f062578116a90b74d7f3c30e861074cadaa677"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7911] + }, + { + "sha": "419a2113044a1579564b9c8a560f8f8ee99eac02", + "subject": "fix(cli): preserve caller paths in format inspections (#7855)", + "body": "fix(cli): preserve caller paths in format inspections (#7855)\n\n* fix(cli): preserve caller paths in format inspections\n\n* fix(cli): retain caller path on partial evidence\n\n* test(cli): preserve caller path in adapter parity checks\n\n* test(rust): account for retained caller path\n\n* fix(wasm): compare shared cli and mcp evidence", + "parents": ["63f05d1cad5784b7f4e8a5647c597b95ab5253e3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7855] + }, + { + "sha": "7ca216a2663376243702d117ce23059680f8ba1f", + "subject": "fix(docs): restore translated offline provider ownership notes (#7964)", + "body": "fix(docs): restore translated offline provider ownership notes (#7964)", + "parents": ["419a2113044a1579564b9c8a560f8f8ee99eac02"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7964] + }, + { + "sha": "7b9bcf724f2589039effe3753ed8268d07ae4f15", + "subject": "style: fix native documentation and test formatting", + "body": "style: fix native documentation and test formatting\n", + "parents": ["7ca216a2663376243702d117ce23059680f8ba1f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3dcb40dc262449bbfcd60c23bf1cd5d870a00c73", + "subject": "fix(uninstall): protect ZCode fallback registrations (#7970)", + "body": "fix(uninstall): protect ZCode fallback registrations (#7970)\n\nfix(uninstall): preserve inactive ZCode fallback servers", + "parents": ["7b9bcf724f2589039effe3753ed8268d07ae4f15"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7970] + }, + { + "sha": "953a7689dfde73b84e7e3ba6af76988394646f0a", + "subject": "fix(uninstall): preserve layered OpenCode registrations (#7969)", + "body": "fix(uninstall): preserve layered OpenCode registrations (#7969)\n\n* fix(uninstall): preflight layered OpenCode fallback\n\n* fix(uninstall): preserve inherited foreign registration facts\n\n* fix(uninstall): preflight legacy OpenCode layer removal", + "parents": ["3dcb40dc262449bbfcd60c23bf1cd5d870a00c73"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7969] + }, + { + "sha": "62ce357f16814c28c59610400426aa7791c410a6", + "subject": "fix(artifacts): preserve known metadata without content hashes (#7932)", + "body": "fix(artifacts): preserve known metadata without content hashes (#7932)\n\n* fix(artifacts): preserve known metadata without content hashes\n\n* fix(artifacts): keep missing relation projections unknown", + "parents": ["953a7689dfde73b84e7e3ba6af76988394646f0a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7932] + }, + { + "sha": "c19f13ca03c92e88d3b322d7a76450bb41453582", + "subject": "fix(setup): preserve YAML annotations during refresh (#7944)", + "body": "fix(setup): preserve YAML annotations during refresh (#7944)\n\n* fix(setup): preserve YAML annotations during refresh\n\n* fix(setup): preserve yaml argument comment ownership", + "parents": ["62ce357f16814c28c59610400426aa7791c410a6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7944] + }, + { + "sha": "cf9f010dcdc01f1227cb1d3ec8e626a1a3b1054d", + "subject": "feat(managed): filter and project retained member views (#7968)", + "body": "feat(managed): filter and project retained member views (#7968)\n\n* feat(managed): filter and project retained member views\n\n* test(managed): guard relationship endpoint filter semantics", + "parents": ["c19f13ca03c92e88d3b322d7a76450bb41453582"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7968] + }, + { + "sha": "50b2ab137f32d6099854e8d4e525a79b0ec786e2", + "subject": "fix(browser): preserve DOM length units in captures and comparisons (#7971)", + "body": "fix(browser): preserve DOM length units in captures and comparisons (#7971)\n\n* fix(browser): declare DOM node value length units\n\n* fix(browser): preserve unknown DOM length comparisons", + "parents": ["cf9f010dcdc01f1227cb1d3ec8e626a1a3b1054d"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7971] + }, + { + "sha": "429355ca4d1078579fca7d286de85c512bed0a96", + "subject": "fix(ci): repair native fixture and unused export", + "body": "fix(ci): repair native fixture and unused export\n", + "parents": ["50b2ab137f32d6099854e8d4e525a79b0ec786e2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d157560d402fbd1b54069ff59039dcde73e4a7e1", + "subject": "fix(cli): reject empty Evidence file arguments (#7988)", + "body": "fix(cli): reject empty Evidence file arguments (#7988)", + "parents": ["429355ca4d1078579fca7d286de85c512bed0a96"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7988] + }, + { + "sha": "d39b3000ec7c44635b2b6a37b31fde2212002996", + "subject": "feat(artifacts): inventory and extract U-Boot FIT images (#7771)", + "body": "feat(artifacts): inventory and extract U-Boot FIT images (#7771)\n\n* feat(artifacts): inventory and extract U-Boot FIT images\n\nopen_binary refused U-Boot Flattened Image Tree files as an unsupported\nformat, so inspect_artifact and extract_artifact could not list or\nrecover a FIT's kernel, devicetree, ramdisk and loadable images.\n\nRecognize an FDT v16/v17 with a top-level /images node and parse it with\nthe existing parseDevicetree. Each /images child becomes an inventory\nentry named images/.bin that extracts its stored bytes from\nembedded data, data-offset (past the 4-aligned devicetree end) or\ndata-position (from the file start). Image format_metadata records the\ndeclared type, arch, os, compression, load and entry; root metadata\nrecords the description, timestamp and configurations.\n\ncrc32, md5, sha1, sha256, sha384 and sha512 hash nodes are verified in\none streamed pass per image; other algorithms are reported unverified.\nSignatures are reported, not verified, and nothing is decompressed,\ndecrypted or executed. Data outside the file, overlapping or duplicate\nimage data, a missing or repeated data source and hash mismatches fail\nclosed. The devicetree is bounded by the fixed 16 MiB allowance;\nexternal image data is streamed from disk.\n\nRefs #7129\n\n* fix(artifacts): bound FIT configuration references and suggest analysis only for plain images\n\n* fix(artifacts): retain buffered FIT stream cancellation\n\n* test(artifacts): gate FIT faults on the observed read phase\n\n* fix(artifacts): verify FIT links and summary identities\n\n* fix(artifacts): bound FIT diagnostics and retain unknown signatures\n\n* fix(artifacts): compare FIT declarations and resolved data links\n\n* fix(artifacts): admit FIT raw probes through the shared loader contract\n\n* fix(artifacts): preserve FIT field availability independently\n\n* fix(artifacts): isolate nested entry metadata from reader facts\n\n---------\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>\nCo-authored-by: gensokyo-dev <342580529+users.noreply.github.com>", + "parents": ["d157560d402fbd1b54069ff59039dcde73e4a7e1"], + "authors": [ + { + "name": "Aaditya", + "email": "107977627+555aaditya@users.noreply.github.com", + "user": { + "login": "555aaditya", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7771] + }, + { + "sha": "2bfd84b2c8484afad29dc3c32bacd82bcc8e69c4", + "subject": "fix(javascript): emit no fork when a literal stdio array omits the IPC channel (#7992)", + "body": "fix(javascript): emit no fork when a literal stdio array omits the IPC channel (#7992)\n\n* fix(javascript): emit no fork when a literal stdio array omits the IPC channel\n\nNode's fork() requires an explicit stdio array to carry the IPC channel:\n\n if (!ArrayPrototypeIncludes(options.stdio, 'ipc'))\n throw new ERR_CHILD_PROCESS_IPC_REQUIRED('options.stdio')\n\nThe throw is synchronous, before any child process exists, but the analysis\nreported a resolved fork with stdioMode \"array\" — byte-identical to the valid\n`[..., \"ipc\"]` form — which projects to a child-process node, a resolved spawns\nrelation and resolved connects-stdio.\n\nMeasured on Node 24.22.1:\n\n fork({stdio: [\"inherit\",\"inherit\",\"inherit\"]}) -> THROWS ERR_CHILD_PROCESS_IPC_REQUIRED\n fork({stdio: [\"pipe\",\"pipe\",\"pipe\"]}) -> THROWS ERR_CHILD_PROCESS_IPC_REQUIRED\n fork({stdio: [\"ipc\"]}) -> SPAWNED connected=true\n fork({stdio: [\"inherit\",\"inherit\",\"inherit\",\"ipc\"]}) -> SPAWNED connected=true\n fork({stdio: \"pipe\"}) -> SPAWNED connected=true\n spawn({stdio: [\"inherit\",\"inherit\",\"inherit\"]})-> SPAWNED connected=false\n\nA string stdio is normalised with \"ipc\" appended, so only the array form can omit\nit. The same array is valid for spawn, which has no IPC requirement.\n\nDrop a fork candidate only when its stdio array is fully literal and provably\nlacks \"ipc\"; a spread or a non-literal element may still supply the channel and\nstays a candidate.\n\n* chore: retrigger title and readiness checks after the title was corrected", + "parents": ["d39b3000ec7c44635b2b6a37b31fde2212002996"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [7992] + }, + { + "sha": "35ea02d27ed1900f6080ad5cb1c6f86d7e87dd05", + "subject": "fix(xml): reject ambiguous namespace attribute identities (#7991)", + "body": "fix(xml): reject ambiguous namespace attribute identities (#7991)", + "parents": ["2bfd84b2c8484afad29dc3c32bacd82bcc8e69c4"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [7991] + }, + { + "sha": "4fbce5c1225e5fba1905ee82c968b590283d0f93", + "subject": "fix(cli): reject empty IPS and PE import targets before resolution (#7963)", + "body": "fix(cli): reject empty IPS and PE import targets before resolution (#7963)\n\ninspect-apple-ips and inspect-pe-imports were the two commands in the\nbinary diagnostics group whose positional target was still a plain\nstring. An empty argument passed CLI validation, was resolved to the\nworking directory, and failed later as a non-file input, unlike their\nsiblings (inspect-elf-notes, inspect-pe-certificates and others) that\nalready reject it at validation.\n\nDeclare both targets with the shared nonempty, NUL-free local path\nschema the rest of the file uses. Explicit \".\" is unchanged.\n\nFixes #7421", + "parents": ["35ea02d27ed1900f6080ad5cb1c6f86d7e87dd05"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [7963] + }, + { + "sha": "fca331804af9dd4fadcec8335e06fc432c26efde", + "subject": "fix(javascript): select JSON and addon loaders by exact suffix (#7821)", + "body": "fix(javascript): select JSON and addon loaders by exact suffix (#7821)\n\nNode's CommonJS loader matches registered extensions case-sensitively, so\nrequire(\"./data.JSON\") and require(\"./addon.NODE\") run as JavaScript.\nDerive target_json_status and the native loads relation from the exact\nloader suffix instead of the inventory's case-folded file kind.\n\nFixes #7623", + "parents": ["4fbce5c1225e5fba1905ee82c968b590283d0f93"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [7821] + }, + { + "sha": "b966ebeb22103356ba108b403d55ecaa6bb047b4", + "subject": "docs(readme): align Linux x64 analysis prerequisites (#7997)", + "body": "docs(readme): align Linux x64 analysis prerequisites (#7997)", + "parents": ["fca331804af9dd4fadcec8335e06fc432c26efde"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7997] + }, + { + "sha": "ddefba83ef72e92fc78f6393a470f5e52a66c288", + "subject": "test(artifacts): handle blocked open-parent renames (#7904)", + "body": "test(artifacts): handle blocked open-parent renames (#7904)\n\n* test(artifacts): handle blocked open-parent renames\n\n* test(artifacts): exercise blocked parent rename cleanup", + "parents": ["b966ebeb22103356ba108b403d55ecaa6bb047b4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7904] + }, + { + "sha": "f60e42a9aece5119719e554715b012b5630735c0", + "subject": "fix(mcp)!: bound validation work before tool dispatch (#7905)", + "body": "fix(mcp)!: bound validation work before tool dispatch (#7905)\n\nReuse the pinned SDK's combined array-element and object-member admission\nbefore canonical validation, deferred runtime loading and tool execution.\nShare a configurable finite allowance across eager/deferred HTTP and stdio,\nand project refusals to bounded, actionable transport resource errors.\n\nPreserve canonical CLI/application contracts, caller-selected input values,\nordinary validation semantics and complete Evidence access. Exercise actual\ntransport boundaries, real artifact/TShark workflows, packaged installation,\ncontinued service and downstream identity/capacity regressions.\n\nFixes #7882\n\nBREAKING CHANGE: MCP tool arguments now default to 1,024 combined array\nelements and object members per call. Select a larger positive finite\nREA_MCP_MAX_INPUT_ELEMENTS allowance and restart for larger inline inputs,\nor use retained/file selectors where supported. Inputs are never truncated.\n\nAssisted-by: Reimu (gensokyo-skills:reimu-incident-triage)\nAssisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)\nAssisted-by: Yukari (gensokyo-skills:yukari-boundary-analysis)", + "parents": ["ddefba83ef72e92fc78f6393a470f5e52a66c288"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [7905] + }, + { + "sha": "54f5cf7e14e347d20828b07a991b644eafd080c9", + "subject": "fix(javascript): retain static facts under projection pressure (#7986)", + "body": "fix(javascript): retain static facts under projection pressure (#7986)\n\n* fix(javascript): retain static facts under projection pressure\n\n* fix(javascript): scope IPC ambiguity to omitted projections\n\n* fix(javascript): preserve IPC uncertainty for omitted sources\n\n* fix(javascript): qualify IPC pairing by wrapper coverage\n\n* fix(javascript): retain provisional IPC wrapper matches", + "parents": ["f60e42a9aece5119719e554715b012b5630735c0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7986] + }, + { + "sha": "afc18131f4518783b7bf42ff7e81491639e5328d", + "subject": "fix(ci): reuse shared JavaScript AST child traversal", + "body": "fix(ci): reuse shared JavaScript AST child traversal\n", + "parents": ["54f5cf7e14e347d20828b07a991b644eafd080c9"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c9bf6a9df712f8e968ac76147c97457ee911f10a", + "subject": "feat(managed)!: show readable type names in member signatures (#5309)", + "body": "feat(managed)!: show readable type names in member signatures (#5309)\n\nfeat(managed): show readable type names in member signatures\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["afc18131f4518783b7bf42ff7e81491639e5328d"], + "authors": [ + { + "name": "LN Bodicherla", + "email": "119286838+ln-bodicherla@users.noreply.github.com", + "user": { + "login": "ln-bodicherla", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [5309] + }, + { + "sha": "d82ba11ce2902ef7b8ad4970e6167a7737bdaa78", + "subject": "test(ci): allow more time for Windows CLI subprocesses", + "body": "test(ci): allow more time for Windows CLI subprocesses\n", + "parents": ["c9bf6a9df712f8e968ac76147c97457ee911f10a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "45cc935964ce71f6d5c98ddfa78f7230463af94a", + "subject": "fix(native): accept walkable Mach-O command tables (#8002)", + "body": "fix(native): accept walkable Mach-O command tables (#8002)\n\n* fix(native): accept walkable Mach-O command tables\n\n* test(native): verify large command tables through macOS CLI and MCP", + "parents": ["d82ba11ce2902ef7b8ad4970e6167a7737bdaa78"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8002] + }, + { + "sha": "ca666ec1308a168df38a31944e15e1ed35b6b5f5", + "subject": "fix(pe): reject invalid certificate bit-string padding (#8011)", + "body": "fix(pe): reject invalid certificate bit-string padding (#8011)", + "parents": ["45cc935964ce71f6d5c98ddfa78f7230463af94a"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8011] + }, + { + "sha": "95637a3d703d0b72150d1790fe28062940707c63", + "subject": "fix(artifacts): name every U-Boot uImage type in the pinned image.h (#8007)", + "body": "fix(artifacts): name every U-Boot uImage type in the pinned image.h (#8007)\n\nTYPE_NAMES stopped at flat_dt (8), while the U-Boot include/image.h\ncommit that the tables are pinned to defines image types 0-47. A header\ndeclaring a later type, such as kernel_noload (14) or tfa-bl31 (45),\nwas reported with type_name \"unknown\".\n\nAdd types 9-47 with their mkimage -T short names from boot/image.c at\nthe same commit. IH_TYPE_LOADABLE (22) has no short name there and is\nnamed \"loadable\", as other tables already name identifiers U-Boot does\nnot list. Identifiers past the enum stay \"unknown\".", + "parents": ["ca666ec1308a168df38a31944e15e1ed35b6b5f5"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [8007] + }, + { + "sha": "124e97eac591724cfc22435f01d586f334789706", + "subject": "fix(native): explain categories whose class reference names no class (#8006)", + "body": "fix(native): explain categories whose class reference names no class (#8006)\n\nAn Objective-C category whose class field is null, or is bound to a\nsymbol other than `_OBJC_CLASS_$_`, was recorded as partial with\n`category_class_unresolved`, but no issue was raised, so the\n`objc_properties_categories` coverage facet reported `partial` with a\nnull reason. swiftc emits such categories for @objc members of an\nextension on another module's Swift class and binds the class field to\nthe class metadata symbol (`_$s…CN`); Keynote and Notability carry them.\n\nReport the reference as a `category_class_unresolved` issue naming the\nbound symbol, or stating that the reference is null, matching the issue\nalready raised for an unreadable local class reference.", + "parents": ["95637a3d703d0b72150d1790fe28062940707c63"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [8006] + }, + { + "sha": "f25d1e3e9fbda7971c312caa3da757dc525a73f6", + "subject": "fix(cli): preserve Amp MCP registration settings (#7995)", + "body": "fix(cli): preserve Amp MCP registration settings (#7995)\n\n* fix(cli): preserve Amp registration environment and report failures (#7538, #7536)\n\n* fix(cli): normalize equals-form mcp add agents before Incur parses them (#7538)\n\n* fix(cli): remove the Amp settings backup after a verified registration (#7538)\n\n* fix(cli): secure Amp registration backups\n\n* test(cli): cover Amp registration backup permissions\n\n* fix(cli): retain Amp registration recovery backups\n\n* fix(cli): create private Amp recovery copies\n\n* test(cli): fix Amp backup assertion typing\n\n* fix(cli): preserve typed Amp backup failures\n\n* fix(cli): handle Amp backup cleanup failures", + "parents": ["124e97eac591724cfc22435f01d586f334789706"], + "authors": [ + { + "name": "STDquantum", + "email": "60764289+STDquantum@users.noreply.github.com", + "user": { + "login": "STDquantum", + "__typename": "User" + } + } + ], + "pullRequests": [7995] + }, + { + "sha": "17ceb77ca5f2632faab8de01da4babff680eac48", + "subject": "fix(mcp): preserve input validation issue attribution (#7981)", + "body": "fix(mcp): preserve input validation issue attribution (#7981)\n\n* fix(mcp): preserve input validation issue attribution\n\n* fix(mcp): charge nested issue projection before allocation\n\n* style(mcp): format server declarations\n\n* fix(mcp): avoid duplicate fallback diagnostics\n\n* test(mcp): assert structured validation issues\n\n* test(mcp): align browser input issue assertions\n\n* fix(mcp): retain SDK diagnostic parts once\n\n* style(mcp): format diagnostic projection\n\n---------\n\nCo-authored-by: Cursor Agent \nCo-authored-by: morluto ", + "parents": ["f25d1e3e9fbda7971c312caa3da757dc525a73f6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7981] + }, + { + "sha": "e3d8d20236e317e959e138d3dfb37e81d00a1cf3", + "subject": "fix(native): preserve dispatch metadata format refusals (#8013)", + "body": "fix(native): preserve dispatch metadata format refusals (#8013)\n\n* fix(native): preserve dispatch metadata format refusals\n\n* test(native): normalize CLI format refusal envelopes\n\n* test(native): assert admitted metadata target paths", + "parents": ["17ceb77ca5f2632faab8de01da4babff680eac48"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8013] + }, + { + "sha": "2b85a4a2bafc82e3d8c8b4024f00216e9f9e8ff7", + "subject": "fix(native): preserve bookmark address uncertainty (#7966)", + "body": "fix(native): preserve bookmark address uncertainty (#7966)\n\nfix(analysis): preserve bookmark address uncertainty\n\nCo-authored-by: Cursor Agent ", + "parents": ["e3d8d20236e317e959e138d3dfb37e81d00a1cf3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7966] + }, + { + "sha": "f7cd4e5256441f69ddb7a3e78167b200460a6601", + "subject": "fix(adb): validate screen capture PNG headers (#7962)", + "body": "fix(adb): validate screen capture PNG headers (#7962)\n\n* fix(adb): validate screen capture PNG headers\n\n* fix(adb): state screen header validation limits\n\n* style(adb): format screen capture assertion\n\nMatch the current formatter after integrating main.\n\nCo-authored-by: morluto \n\n---------\n\nCo-authored-by: Cursor Agent \nCo-authored-by: morluto ", + "parents": ["2b85a4a2bafc82e3d8c8b4024f00216e9f9e8ff7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7962] + }, + { + "sha": "bd3792566d7817b2feb0246be1e5eb2cff16dbaf", + "subject": "docs(skill): clarify scenario pause deadlines (#7961)", + "body": "docs(skill): clarify scenario pause deadlines (#7961)\n\nCo-authored-by: Cursor Agent ", + "parents": ["f7cd4e5256441f69ddb7a3e78167b200460a6601"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7961] + }, + { + "sha": "3503578f911c2471adb237d1459b79e6dcae1f52", + "subject": "fix(session): preserve cancellation during mutation retirement (#7959)", + "body": "fix(session): preserve cancellation during mutation retirement (#7959)\n\n* fix(session): preserve cancellation during mutation retirement\n\n* fix(session): retain exact cleanup owners through retry\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["bd3792566d7817b2feb0246be1e5eb2cff16dbaf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7959] + }, + { + "sha": "131fbe0754332cdcf6f2ce951dad3b026f982e8d", + "subject": "feat(environment): serve writes whose calls send different members (#7539)", + "body": "feat(environment): serve writes whose calls send different members (#7539)\n\n* feat(environment): serve the writes callers make without recorded form fields\n\n- A create member a recording sent empty (\"\", null, false, [] or {}) is no\n longer required; a call that leaves it out is applied as sending that value\n (body.blank).\n- List views render envelope members that list the listed entities' ids\n (Paperless's `all`), so creates in such collections are confirmed.\n- Updates move their entity in collections kept sorted by a field they write,\n and a failed whole-collection read after an update can teach that order.\n- A later create that stores an unruled field otherwise is withheld at the\n create, and an item read may fill values a create's answer had not loaded.\n- An unsent field respelled between null, [] and {} is unchanged.\n- The skill asks for one create with every field and one with only what a\n person must give.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): show how to read signed-in pages before recording\n\nAgents guessed capture keys (artifacts, dom, final) to see pages behind\nsign-in, which inspect_web_page cannot reach.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): accept every empty spelling recorded creates sent\n\nA create that fills only what a person must give sends `null` where the\nfull create sent a string, and `null` or `false` for the same flag. The\nmerged plan now accepts each recorded empty value, and a call that leaves\nthe member out is applied as the earliest call sent it.\n\nAlso adds the spec folder for this change.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): keep the vary-fields step neutral on UI or API writes\n\nAgents read \"the form\" as a cue to write through the UI, where some\napplications' request bodies are not exposed; a body-unusable UI write\nnow re-records once with request steps.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record verification for blank members and sorted writes\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): address review of blank members and sorted writes\n\n- Bulk updates move their entities in turn against the others' earlier\n values and install the final order once, as replay does.\n- A member's recorded empty values stay accepted once a later call teaches\n its default; a left-out member with a default keeps the default.\n- Write answers spell empty lists and maps as their recorded answers did.\n- A rename can teach a sort when the creates chose one by a field the\n update did not write, such as ids that ascend with titles.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve the writes that later reads explain\n\n- An item read whose object is marked deleted (deleted, isDeleted or\n is_deleted true) agrees with an absent entity, as EspoCRM answers a\n deleted record; such an object never seeds or adopts an entity.\n- maxSize, max_results and maxResults are page sizes, for whole-collection\n list lines and the list query's limit role.\n- An item view also shows the fields only reads after its type's first write\n show, when no initial entity holds them (Vikunja's task subscription),\n without requiring them; write answers leave such a field out for entities\n without it, and it no longer withholds the write as incomplete-entities.\n- The skill asks updates to change the fields a person would change, and\n expects a deleted object to read back as 404 or marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer sent empty members as sent, and keep a placed create's order\n\n- A write answer spells an empty list or map the call did not send as its\n recorded answer did; one the call sent is answered as sent, so a create\n sending `[]` is not answered `null` because the first recorded create was.\n- A read listing the whole collection that placed a create leaves the create\n only the sorted inserts whose order that read follows, so a later rename\n cannot teach a sort an earlier read ruled out.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer bulk updates without fields only later reads show\n\nA bulk update's answer renders each entity with the same allowance a single\nupdate's answer has: a field only reads after the type's first write showed,\nwhich no initial entity holds, is left out for an entity without it, so a\nbulk update of a seeded task is no longer refused for lacking it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): correct how the EspoCRM contact update task passes\n\nThe agent trajectories show gpt-oss passes it by creating a replacement contact\nand deleting the original, since the served update refuses emailAddress; the\nupdate itself is refused in both builds.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a read of a served-deleted entity marked deleted\n\nAn application that soft-deletes still answers a deleted record by id, marked\ndeleted. Serving now keeps an entity a served delete removed from a type whose\nrecorded item reads show that, until a reset or load and within the size\ndata/add loads, and answers a read of it with its last fields and the flag\ntrue, instead of refusing the read.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers, check bulk answers with sent members, narrow inserts only on collection-order reads\n\n- A create whose item read loaded values its answer had not records them\n (`observation.read.unloaded`), and a served create's answer keeps them as\n the recorded answer showed them, a zero-time owner included, while the state\n holds the read's.\n- Replay checks a bulk update's recorded answers with each target's sent\n members, as serving answers them, so echoed `null` and `[]` no longer make\n the plan body-unusable.\n- A whole-collection read whose query sorts it shows the query's order, so it\n no longer narrows a create's sorted insert candidates.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the census with main's unknown-clock rule merged\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve query numbers, counted values and made objects\n\n- A query parameter accepts a number or boolean, which serving sends as its\n JSON text, as agents send page sizes and flags.\n- A sequence may start at the value its first create took above every value\n its type held (Vikunja's per-project task index), and a later create's\n composed, template or started-sequence rule is adopted when it also spells\n the first create's value.\n- A made-object rule explains an object the application makes with each\n created entity: members the request stamped, members holding the entity's\n own id, and counts one past the held objects' values.\n- A create's answer names the id of the one object a one-element array member\n holds, so bulk creates link to their type.\n- The skill reads each listed object by id before writing.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): let a linked create take path values it stores\n\nA create linked to its type's own collection, whose path has no parameters,\naccepts any path values when its plan stores each one in a field, as a Vikunja\ntask stores its project; replay and serving apply it alike.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn a sort from a rename only when moving its entities reaches it\n\nServing moves only the entities a write changes in a collection kept sorted,\nso replay now tries a sort after a rename only when the entities no write the\nread exercised changed already follow it. Seeded folders listed out of title\norder no longer teach a title sort that serving would answer with another\norder.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers a sent value did not echo, and learn no sort from query-sorted reads\n\n- A served create keeps a value its recorded answer had not loaded unless the\n call sent that member and the plan stores it as sent, so a create sending\n `active: false` is answered `false` as recorded while the state holds the\n read's `true`.\n- A rename no longer teaches a sort from a whole-collection read its query\n sorts, whose ties need not follow the collection's own order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): verify query values, counted values and made objects\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag in the state view and serve by it\n\nExtraction now records the member later item reads set true on a record the\napplication soft-deleted, and the item view carries it as `deleted_flag`.\nServing reads that fact instead of scanning recorded bodies itself, so one\nowner decides what a soft delete looks like.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the call-values checks at #7274 93821024\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag from item reads with a query too\n\nA client may read a deleted record back only with a query, such as a\ncache-busting parameter. Every successful read of the item tool now shows the\nflag; only plain later reads still add fields.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the call-values checks at #7274 45832406\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn sorts only from orders a list read confirmed\n\n- A sort retry after a failed whole-collection read requires the entities no\n write changed since a list last showed them to follow it already, rather than\n excusing every entity the update's tool ever wrote: an earlier rename a list\n confirmed in place stays where it was.\n- An update takes its creates' sort only from a create a list read showed\n placed; replay still tries a sort a create guessed from the initial order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): drop entities read back as deleted and answer soft deletes as deleted\n\n- A held entity a later read shows marked deleted is dropped, not adopted with\n the marked object's fields.\n- Bulk-update replay renders answers with the optional and later-only fields\n serving uses, so a bulk update of created and seeded entities replays.\n- A served delete of a soft-deleting type answers with the entity marked\n deleted, single and bulk.\n- A deleted flag only query reads showed is a field of the item view, so a\n served tombstone keeps it where live records omit it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): check made objects as recorded and keep their ids and clocks honest\n\n- A made object's clock counts as a write clock, so a capture with no clock\n anchor withholds the create instead of stamping 1970.\n- Members holding the entity's identity follow the id written, generated or\n sent, through the type's id field.\n- A later create's made object is checked as recorded, before its own members\n are rewritten, so one naming another entity withholds the plan.\n- A later create's template is adopted only when it spells that create's value\n too, not just when the first create's text holds its source value.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): move updated entities only by placed sorts and keep query-sorted reads from confirming order\n\nReplay moved an updated entity by a sort a create only guessed, while the\nupdate plan exported only placed sorts, so a read could confirm an update\nby a move serving would not make. Both now use the placed sort. A passing\nlist read clears its entities from the moved set only when the state\ndecides the order of every entity it lists, so a read whose query sorts\nit no longer hides an earlier move from a later sort check.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): count six withheld plans that explain more, not seven\n\nThe bulk task create counted among them is served on this branch.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): try a learned sort by moving each pending write in turn, as serving does\n\n#retrySort sorted the whole collection, which a list could match while\nserving, moving each renamed entity in turn against the others' values\nbefore their own writes, gave another order. The state now records the\nvalues each write replaced, and the retry replays the writes since a\nlist in collection order last showed their entities.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a served delete with the deleted flag its recorded answer showed\n\nAn application may answer a delete with the record as it was and mark it\ndeleted only on later reads. Delete answers, single and bulk, now take\nthe flag's value from the recorded answer; reads of a served-deleted\nentity still show it marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): set aside two hunks next to lines main's saved-values change rewrites\n\nMain's #7267 changes the lines beside the blank-member docs and the\nempty-spelling check in explainUpdate. Setting them aside lets that merge\napply cleanly; the commit after it puts them back on top of main's text.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): restore the set-aside hunks on main and bump the skill to 51\n\nPuts the blank-member docs and the empty-spelling check back beside main's\nslug and composed text and heldSlugRule. Main is at skill 50 with\ndifferent text, so this branch's skill changes take 51.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): bump the skill to 52 above #7260's 51\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): put back the call-values hunks main's merge took its side for, and bump the skill to 53\n\nThe merge of main kept main's side where it overlapped this branch, so it\ncould commit without a conflict. This restores this branch's side next to\nmain's: made-object agreement beside the & slug spellings, sequence starts\nin the earlier evidence (now built by earlierOf), the combined value\nimports, and recording step 2 beside main's UI-first step 3. Main is at\nskill 50 and #7274 at 52, so this branch takes 53.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep sorts a list showed in place ruled out, and created answers' nested members as recorded\n\nA whole list in collection order that showed a renamed entity where a\nsort by the renamed field would have moved it now rules that sort out, so\na later rename of the same entity cannot teach it. A create's answer\nleaves out members its item read added inside an object the answer\nshowed, as the recorded answer did; the state still stores them.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve writes whose calls send different members\n\nRecordings now vary what a type's two creates and updates send, and REA\nwithheld writes where a later call left out what the first sent. An update\nplan's required members narrow to those every call sent; a member one create\nsent and another left for the application to number is a sequence that\ntakes the value a call sends; a PUT's left-out member the application\ncleared becomes that member's default; and an update's clock is held as\nthe read after it spells it. The skill spaces creates (skill 54).\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep a later create's made object only with clocks its request stamped\n\nfollowsMadeObjects only checked that a made object's clocks parsed, so a\nlater create whose object showed an older clock still passed, while serving\nstamps the write's clock. Its clocks must now be in the rule's format and\nwithin the stamp window of that create's request.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): accept sent values either way, check defaults against every call, and store update clocks as reads spell them\n\nA sequence that takes sent values now accepts one a later create sent\nafter the first left the member to be numbered. A default an update learned\nmust agree with every update that left its member out, else the plan is\nwithheld. An update plan whose read-back spells a stamped clock at a coarser\nprecision keeps that read as observation.read, and serving stores the\nupdate's clocks in its spelling while answers keep the response's.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): check recorded member and sequence values\n\n* fix(environment): compare soft-deleted read fields\n\n* fix(environment): reject contradictory learned sequences\n\n* fix(environment): preserve initially deleted item observations\n\n* fix(environment): index stored deleted entities separately\n\n* fix(environment): replay lists that include deleted records\n\n* fix(environment): count a sequence number a create sends, as replay does\n\nServing now records a number a call sends for a `sequence` with `sent` in the\nsame count history it generates from, so after that entity is deleted the next\ngenerated number still follows it, as replay's takeSequences does.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): make no count of a made-object member earlier creates held alike\n\nA count only a later create shows starts at the exemplar's value, which is\nright only while the exemplar is the one create accepted: creates accepted\nafter it showed the member unchanged, which a count would have moved. The\nmerge now refuses such a count, as the top-level sequence check does.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): check PUT defaults against reads, and respell update clocks by serving's rule\n\nA default a PUT learns must also agree with what the read after an earlier or\nthe current call showed for the member its answer left out, so a call whose\nread showed the member kept withholds a later clearing default.\n\nReplay and serving now choose an update clock's stored spelling by one rule,\nreadSpellsCoarser: the read after it at a coarser precision in the same zone\nand separator. A read in another zone or separator is no longer adopted by\nreplay, which serving could not store, and a create's plain clocks stay as\nanswered, as serving makes them.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep the largest sequence value in replay, and store update clocks by the kept read\n\nReplay now keeps the largest value a sequence took, as serving's commitWrite\ndoes, so a lower sent value no longer lowers the next number.\n\nServing stores every update's clocks in the spelling of the read the plan\nkeeps as observation.read; replay now does the same through\nreadSpelledClocks, instead of adopting each update's own read, so a later\nupdate whose read spells its clock otherwise contradicts the plan. The plain\nclock branch of restampedFields, which no caller used any more, is gone.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep a left-out default from numbering, a read's sub-millisecond digits, and references named by member\n\nA member a call left out and the application stored a fixed value for is no\nlonger turned into a numbered sequence by a later call that left it out.\nServing shortens an update's clock to the read's precision from the answer's\nown digits, keeping microseconds. A PUT that names a reference field's entity\nby its member supplies that field, for the default check and in serving.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): count a reference a later PUT names toward the default an earlier one cleared\n\nThe default check now reads the reference rules the current call shows as\nwell as the plan's, so a PUT naming the owner by ownerId after one that\ncleared it is served, as in the other order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): number a left-out member past every sent value, and never fill it with a sent blank\n\nA later create the application numbered at or below a value an earlier create\nsent no longer turns the echo into a numbered sequence, since serving counts\npast every sent value. A member a numbered sequence covers is not filled with\nan empty value another call sent when a call leaves it out.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): count sent values in the sequence's scope before numbering a left-out member\n\nThe largest value earlier creates sent is kept by type and by collection, and\na collection-scoped sequence adopted later checks only its own collection, so\na number sent in another collection no longer withholds a create numbered\nwithin its own.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["3503578f911c2471adb237d1459b79e6dcae1f52"], + "authors": [ + { + "name": "Edgar Arakelyan", + "email": "edgar.arakelyan@scale.com", + "user": { + "login": "earakely-scale", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7539] + }, + { + "sha": "c88e1b0b4355a29ef6ab5c88d393a3bfbcfc1d22", + "subject": "feat(guidance): search installed workflow sections (#6996)", + "body": "feat(guidance): search installed workflow sections (#6996)\n\n* feat(guidance): search bundled REA workflow guidance\n\n* fix(guidance): address review findings\n\n* test(guidance): fix boundary and dispatcher coverage\n\n* test(setup): use supported doctor fixture runtime\n\n* fix(guidance): resolve CI conformance, coverage, and review findings\n\n* fix(guidance): own complete requests through shutdown\n\n* test(guidance): bound lifecycle gates and join failed work\n\n---------\n\nCo-authored-by: Deepak-Kambala \nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["131fbe0754332cdcf6f2ce951dad3b026f982e8d"], + "authors": [ + { + "name": "Deepak Kambala", + "email": "deepakkambala21@gmail.com", + "user": { + "login": "Deepak-Kambala", + "__typename": "User" + } + }, + { + "name": "Deepak-Kambala", + "email": "deepakkambala07@gmail.com", + "user": null + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [6996] + }, + { + "sha": "d3ecf6800015f2183a298d78ffb30a266a9efd2a", + "subject": "docs(website): clarify platform setup requirements (#7925)", + "body": "docs(website): clarify platform setup requirements (#7925)\n\n* fix(website): clarify platform setup requirements\n\n* style(website): format platform guidance\n\n* docs(website): clarify Ghidra Linux host support\n\n* style(website): format the Linux platform guidance paragraph\n\n* docs(website): refresh gettext locations after guidance formatting\n\nThe wrapped get-started paragraph shifted source lines. Message ids and translations are unchanged.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["c88e1b0b4355a29ef6ab5c88d393a3bfbcfc1d22"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7925] + }, + { + "sha": "860fdd8fbeded2ddf9abfac61f6982db7458e94e", + "subject": "feat(macho): report per-slice encryption status in inspect_macho (#5359)", + "body": "feat(macho): report per-slice encryption status in inspect_macho (#5359)\n\n* refactor(macho): extract non-throwing container and slice load-command readers\n\nSplit readMachoImage into readMachoContainer, which classifies a file as\nthin, FAT or not Mach-O and keeps FAT range issues per slice, and\nreadSliceLoadCommands, which reads one slice header and frames its load\ncommands, returning every command framed before a failure.\n\nreadMachoImage keeps its strict policy on top of them: commands framed\nbefore a framing defect still decode first, an unsupported FAT slice\nstill yields to a later malformed one, and the first FAT range issue is\nstill reported. A characterization test pins that precedence for inputs\nwith several defects; it passes against both the previous and the new\nimplementation.\n\nPart of #4306.\n\n* feat(macho): report per-slice encryption status in inspect_macho\n\ninspect_macho now reports the LC_ENCRYPTION_INFO(_64) state of every\nslice in a new `encryption` collection, read in process from load\ncommands without reading code bytes.\n\n- Each slice is encrypted, not-encrypted, absent, malformed or unknown.\n Absent requires a completed load-command walk; malformed and unknown\n carry a reason and keep commands read before the failure.\n- The named range is end-exclusive in slice and input-file coordinates\n and maps to file-backed segment fragments, VM addresses and the\n overlapping nonempty sections.\n- A ciphertext range adds a limitation naming its input-file bytes.\n- The in-process read and the native tools are bracketed by one regular\n file descriptor and stat identity checks; a change reports\n artifact_changed. A missing or inaccessible target keeps the tool\n facts and reports encryption as non-exhaustive, never absent.\n- Retained Evidence recorded before this field is parsed by the owning\n schema and reports encryption as unknown in the macho view and in\n managed/native verification.\n\nFixes #4306\n\n* fix(macho): keep slice facts and failures under large tables and close errors\n\n- Frame load commands through a visitor instead of retaining every\n command, restoring the pre-refactor memory profile (2M eight-byte\n commands: peak heap 370 MiB -> 0.9 MiB).\n- Confirm a large FAT container from a valid slice's Mach-O header so a\n sibling's range fault stays per slice instead of hiding healthy slices.\n- Name only sections whose bytes the range and their segment both cover.\n- Throw inspection failures inside the owned descriptor callback so a\n close failure keeps them as its primary error.\n\n* fix(macho): map encrypted ranges only within segment VM extents\n\nmapRange gave every file-backed segment fragment VM addresses, even for a\nsegment with no VM size, whose file bytes dyld never maps, and past vmsize\nwhen a segment declared more file bytes than memory.\n\nRead vmsize with the segment. A segment with no VM size keeps its fragment\nwith null VM addresses. A file size beyond the VM size, or a VM range past\nthe address space, makes the mapping unknown with a reason while the slice\nkeeps its encryption status.\n\nThe docs also claimed the encryption read never reads code bytes. Like\nevery Mach-O container read, a 0xcafebabe input of at most 16 MiB is read\nwhole to rule out a JVM class file; say so.\n\n* fix(macho): read encryption through the admitted descriptor facts\n\nMain's withArtifactRegularFile now hands callers the admitted handle and\nits initial stats. Use those facts instead of re-stating the handle, and\npass the legacy Evidence payload straight to createEvidence.\n\n* fix(macho): retain a finished report when the target close fails\n\nThe file owner keeps the completed callback value when the descriptor close\nfails or cancellation arrives during close. inspect_macho now validates that\nvalue and retains the report as the error's partial observation, as\ninspect_signature does, instead of returning only the cleanup or\ncancellation error.\n\n* test(native): supply readEncryption in merged dyld refusal cases\n\nmain's new dyld refusal cases build NativeMachoInspectionContext without\nthe encryption reader this branch requires.\n\n* test(views): bind the Mach-O encryption page to its facet\n\nmain's facet-ownership case builds inspect_macho Evidence without the\nencryption coverage this branch requires; the fixture now carries one\nslice row and the loop checks the encryption page like the other facets.\n\n* fix(macho): bound encryption commands and range mapping across slices\n\nA slice retains at most two encryption load commands, since a second one\nalready makes it malformed; the reason keeps the full count. Range mapping\nin every slice shares one budget of segment and section records, charged\nfrom each segment command's capacity before it is decoded. A slice past\nthe budget keeps its encryption status and reports an unknown mapping.\n\n* style(macho): format encryption reader and binding test\n\n* fix(macho): stop retaining segments past the mapping budget\n\nSegment commands are collected during framing only while their mapping\nrecords still fit in the budget shared by all slices, and the budget is\ncharged only when the slice maps its range.\n\n* docs(macho): clarify retained mapping allowance\n\n* fix(ci): own the Mach-O encryption test in Apple scope\n\n---------\n\nCo-authored-by: t \nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["d3ecf6800015f2183a298d78ffb30a266a9efd2a"], + "authors": [ + { + "name": "김준호", + "email": "101695482+chordpli@users.noreply.github.com", + "user": { + "login": "chordpli", + "__typename": "User" + } + }, + { + "name": "t", + "email": "t@t", + "user": null + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [5359] + }, + { + "sha": "01e00dae72e1dbac91b2f5d9997d5e0b8091ad3a", + "subject": "fix(process): corroborate exiting Linux ownership candidates (#7958)", + "body": "fix(process): corroborate exiting Linux ownership candidates (#7958)\n\n* fix(process): corroborate Linux exits after procfs environ read races\n\nA token read failing with ENOENT/ESRCH may race with process exit while\nnative identity observation still sees a live PID. Recheck native lifetime\nand accept absence only when corroborated; keep unverifiable or reused\nPIDs fail closed.\n\nRefs #7790\n\n* fix(process): recheck Linux exit after final token retry\n\nA process can exit after the final retry of a failed procfs environment\nread. Re-observe native identity before producing final cleanup failures,\nand keep PID replacement and uncertain identity fail-closed.\n\nAdd five integration-facing sweep regression cases for absence, live,\nunavailable, replaced and zombie-replaced candidates.\n\nRefs #7790\n\n* fix(process): bound native exit settlement for token-open races\n\nAfter a terminal ENOENT/ESRCH run-token read, allow a tightly bounded\nnative-only settlement window to corroborate pending Linux process exit.\nRetain an explicit failure for live/unavailable or changed PID identities,\nwithout inferring exit from the token error itself.\n\nCover delayed absence, delayed replacement and bounded live retries.\n\nRefs #7790\n\n* fix(process): share native token exit settlement\n\n* fix(process): signal only groups with validated members\n\n* fix(process): retain lineage through exit settlement\n\n* fix(process): type mixed identity observations in exit checks\n\nMap inference collapsed a readable/absent union onto the absent\noverload after main tightened ProcessIdentityObservation.\n\n* fix(process): refresh groups whose members exit during revalidation\n\nA same-group child forked after the revalidation snapshot is not an\nempty group, so cleanup reads the table again before skipping the signal.\n\n* test(process): arm group-refresh exit from the revalidation snapshot\n\nThe regression follows the table read after planning observed the\nlauncher token, and requires a later refresh to see the forked child.\n\n* test(mcp): assert bundle path issues by field\n\nThe compare_bundles rejection reports each relative path as an\ninvalid_format issue instead of one joined diagnostic sentence.\n\n* test(mcp): assert field issues for bundle paths and Dart ABI\n\nRelative bundle paths and rejected ABI selectors are reported as\ninput issues on those fields, not as one joined diagnostic sentence.\n\n---------\n\nCo-authored-by: Harshit Sharma <66710144+harshitethic@users.noreply.github.com>\nCo-authored-by: Cursor Agent ", + "parents": ["860fdd8fbeded2ddf9abfac61f6982db7458e94e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Harshit Sharma", + "email": "66710144+harshitethic@users.noreply.github.com", + "user": { + "login": "harshitethic", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7958] + }, + { + "sha": "51ad84516e55153c2d22704044f6d2b7de8a6fb4", + "subject": "feat(environment): serve sorted creates, listed references and toggles (#7600)", + "body": "feat(environment): serve sorted creates, listed references and toggles (#7600)\n\n* feat(environment): serve the writes callers make without recorded form fields\n\n- A create member a recording sent empty (\"\", null, false, [] or {}) is no\n longer required; a call that leaves it out is applied as sending that value\n (body.blank).\n- List views render envelope members that list the listed entities' ids\n (Paperless's `all`), so creates in such collections are confirmed.\n- Updates move their entity in collections kept sorted by a field they write,\n and a failed whole-collection read after an update can teach that order.\n- A later create that stores an unruled field otherwise is withheld at the\n create, and an item read may fill values a create's answer had not loaded.\n- An unsent field respelled between null, [] and {} is unchanged.\n- The skill asks for one create with every field and one with only what a\n person must give.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): show how to read signed-in pages before recording\n\nAgents guessed capture keys (artifacts, dom, final) to see pages behind\nsign-in, which inspect_web_page cannot reach.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): accept every empty spelling recorded creates sent\n\nA create that fills only what a person must give sends `null` where the\nfull create sent a string, and `null` or `false` for the same flag. The\nmerged plan now accepts each recorded empty value, and a call that leaves\nthe member out is applied as the earliest call sent it.\n\nAlso adds the spec folder for this change.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(skill): keep the vary-fields step neutral on UI or API writes\n\nAgents read \"the form\" as a cue to write through the UI, where some\napplications' request bodies are not exposed; a body-unusable UI write\nnow re-records once with request steps.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record verification for blank members and sorted writes\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): address review of blank members and sorted writes\n\n- Bulk updates move their entities in turn against the others' earlier\n values and install the final order once, as replay does.\n- A member's recorded empty values stay accepted once a later call teaches\n its default; a left-out member with a default keeps the default.\n- Write answers spell empty lists and maps as their recorded answers did.\n- A rename can teach a sort when the creates chose one by a field the\n update did not write, such as ids that ascend with titles.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve the writes that later reads explain\n\n- An item read whose object is marked deleted (deleted, isDeleted or\n is_deleted true) agrees with an absent entity, as EspoCRM answers a\n deleted record; such an object never seeds or adopts an entity.\n- maxSize, max_results and maxResults are page sizes, for whole-collection\n list lines and the list query's limit role.\n- An item view also shows the fields only reads after its type's first write\n show, when no initial entity holds them (Vikunja's task subscription),\n without requiring them; write answers leave such a field out for entities\n without it, and it no longer withholds the write as incomplete-entities.\n- The skill asks updates to change the fields a person would change, and\n expects a deleted object to read back as 404 or marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer sent empty members as sent, and keep a placed create's order\n\n- A write answer spells an empty list or map the call did not send as its\n recorded answer did; one the call sent is answered as sent, so a create\n sending `[]` is not answered `null` because the first recorded create was.\n- A read listing the whole collection that placed a create leaves the create\n only the sorted inserts whose order that read follows, so a later rename\n cannot teach a sort an earlier read ruled out.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer bulk updates without fields only later reads show\n\nA bulk update's answer renders each entity with the same allowance a single\nupdate's answer has: a field only reads after the type's first write showed,\nwhich no initial entity holds, is left out for an entity without it, so a\nbulk update of a seeded task is no longer refused for lacking it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): correct how the EspoCRM contact update task passes\n\nThe agent trajectories show gpt-oss passes it by creating a replacement contact\nand deleting the original, since the served update refuses emailAddress; the\nupdate itself is refused in both builds.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a read of a served-deleted entity marked deleted\n\nAn application that soft-deletes still answers a deleted record by id, marked\ndeleted. Serving now keeps an entity a served delete removed from a type whose\nrecorded item reads show that, until a reset or load and within the size\ndata/add loads, and answers a read of it with its last fields and the flag\ntrue, instead of refusing the read.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers, check bulk answers with sent members, narrow inserts only on collection-order reads\n\n- A create whose item read loaded values its answer had not records them\n (`observation.read.unloaded`), and a served create's answer keeps them as\n the recorded answer showed them, a zero-time owner included, while the state\n holds the read's.\n- Replay checks a bulk update's recorded answers with each target's sent\n members, as serving answers them, so echoed `null` and `[]` no longer make\n the plan body-unusable.\n- A whole-collection read whose query sorts it shows the query's order, so it\n no longer narrows a create's sorted insert candidates.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the census with main's unknown-clock rule merged\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve query numbers, counted values and made objects\n\n- A query parameter accepts a number or boolean, which serving sends as its\n JSON text, as agents send page sizes and flags.\n- A sequence may start at the value its first create took above every value\n its type held (Vikunja's per-project task index), and a later create's\n composed, template or started-sequence rule is adopted when it also spells\n the first create's value.\n- A made-object rule explains an object the application makes with each\n created entity: members the request stamped, members holding the entity's\n own id, and counts one past the held objects' values.\n- A create's answer names the id of the one object a one-element array member\n holds, so bulk creates link to their type.\n- The skill reads each listed object by id before writing.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): let a linked create take path values it stores\n\nA create linked to its type's own collection, whose path has no parameters,\naccepts any path values when its plan stores each one in a field, as a Vikunja\ntask stores its project; replay and serving apply it alike.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn a sort from a rename only when moving its entities reaches it\n\nServing moves only the entities a write changes in a collection kept sorted,\nso replay now tries a sort after a rename only when the entities no write the\nread exercised changed already follow it. Seeded folders listed out of title\norder no longer teach a title sort that serving would answer with another\norder.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep unloaded create answers a sent value did not echo, and learn no sort from query-sorted reads\n\n- A served create keeps a value its recorded answer had not loaded unless the\n call sent that member and the plan stores it as sent, so a create sending\n `active: false` is answered `false` as recorded while the state holds the\n read's `true`.\n- A rename no longer teaches a sort from a whole-collection read its query\n sorts, whose ties need not follow the collection's own order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): verify query values, counted values and made objects\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag in the state view and serve by it\n\nExtraction now records the member later item reads set true on a record the\napplication soft-deleted, and the item view carries it as `deleted_flag`.\nServing reads that fact instead of scanning recorded bodies itself, so one\nowner decides what a soft delete looks like.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the call-values checks at #7274 93821024\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn the soft-delete flag from item reads with a query too\n\nA client may read a deleted record back only with a query, such as a\ncache-busting parameter. Every successful read of the item tool now shows the\nflag; only plain later reads still add fields.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the call-values checks at #7274 45832406\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): learn sorts only from orders a list read confirmed\n\n- A sort retry after a failed whole-collection read requires the entities no\n write changed since a list last showed them to follow it already, rather than\n excusing every entity the update's tool ever wrote: an earlier rename a list\n confirmed in place stays where it was.\n- An update takes its creates' sort only from a create a list read showed\n placed; replay still tries a sort a create guessed from the initial order.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): drop entities read back as deleted and answer soft deletes as deleted\n\n- A held entity a later read shows marked deleted is dropped, not adopted with\n the marked object's fields.\n- Bulk-update replay renders answers with the optional and later-only fields\n serving uses, so a bulk update of created and seeded entities replays.\n- A served delete of a soft-deleting type answers with the entity marked\n deleted, single and bulk.\n- A deleted flag only query reads showed is a field of the item view, so a\n served tombstone keeps it where live records omit it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): check made objects as recorded and keep their ids and clocks honest\n\n- A made object's clock counts as a write clock, so a capture with no clock\n anchor withholds the create instead of stamping 1970.\n- Members holding the entity's identity follow the id written, generated or\n sent, through the type's id field.\n- A later create's made object is checked as recorded, before its own members\n are rewritten, so one naming another entity withholds the plan.\n- A later create's template is adopted only when it spells that create's value\n too, not just when the first create's text holds its source value.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): move updated entities only by placed sorts and keep query-sorted reads from confirming order\n\nReplay moved an updated entity by a sort a create only guessed, while the\nupdate plan exported only placed sorts, so a read could confirm an update\nby a move serving would not make. Both now use the placed sort. A passing\nlist read clears its entities from the moved set only when the state\ndecides the order of every entity it lists, so a read whose query sorts\nit no longer hides an earlier move from a later sort check.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): count six withheld plans that explain more, not seven\n\nThe bulk task create counted among them is served on this branch.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): try a learned sort by moving each pending write in turn, as serving does\n\n#retrySort sorted the whole collection, which a list could match while\nserving, moving each renamed entity in turn against the others' values\nbefore their own writes, gave another order. The state now records the\nvalues each write replaced, and the retry replays the writes since a\nlist in collection order last showed their entities.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): answer a served delete with the deleted flag its recorded answer showed\n\nAn application may answer a delete with the record as it was and mark it\ndeleted only on later reads. Delete answers, single and bulk, now take\nthe flag's value from the recorded answer; reads of a served-deleted\nentity still show it marked deleted.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): set aside two hunks next to lines main's saved-values change rewrites\n\nMain's #7267 changes the lines beside the blank-member docs and the\nempty-spelling check in explainUpdate. Setting them aside lets that merge\napply cleanly; the commit after it puts them back on top of main's text.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): restore the set-aside hunks on main and bump the skill to 51\n\nPuts the blank-member docs and the empty-spelling check back beside main's\nslug and composed text and heldSlugRule. Main is at skill 50 with\ndifferent text, so this branch's skill changes take 51.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): bump the skill to 52 above #7260's 51\n\nCo-Authored-By: Claude Opus 5.5 \n\n* chore(environment): put back the call-values hunks main's merge took its side for, and bump the skill to 53\n\nThe merge of main kept main's side where it overlapped this branch, so it\ncould commit without a conflict. This restores this branch's side next to\nmain's: made-object agreement beside the & slug spellings, sequence starts\nin the earlier evidence (now built by earlierOf), the combined value\nimports, and recording step 2 beside main's UI-first step 3. Main is at\nskill 50 and #7274 at 52, so this branch takes 53.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep sorts a list showed in place ruled out, and created answers' nested members as recorded\n\nA whole list in collection order that showed a renamed entity where a\nsort by the renamed field would have moved it now rules that sort out, so\na later rename of the same entity cannot teach it. A create's answer\nleaves out members its item read added inside an object the answer\nshowed, as the recorded answer did; the state still stores them.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(environment): serve writes whose calls send different members\n\nRecordings now vary what a type's two creates and updates send, and REA\nwithheld writes where a later call left out what the first sent. An update\nplan's required members narrow to those every call sent; a member one create\nsent and another left for the application to number is a sequence that\ntakes the value a call sends; a PUT's left-out member the application\ncleared becomes that member's default; and an update's clock is held as\nthe read after it spells it. The skill spaces creates (skill 54).\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep a later create's made object only with clocks its request stamped\n\nfollowsMadeObjects only checked that a made object's clocks parsed, so a\nlater create whose object showed an older clock still passed, while serving\nstamps the write's clock. Its clocks must now be in the rule's format and\nwithin the stamp window of that create's request.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): accept sent values either way, check defaults against every call, and store update clocks as reads spell them\n\nA sequence that takes sent values now accepts one a later create sent\nafter the first left the member to be numbered. A default an update learned\nmust agree with every update that left its member out, else the plan is\nwithheld. An update plan whose read-back spells a stamped clock at a coarser\nprecision keeps that read as observation.read, and serving stores the\nupdate's clocks in its spelling while answers keep the response's.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): check recorded member and sequence values\n\n* fix(environment): compare soft-deleted read fields\n\n* fix(environment): reject contradictory learned sequences\n\n* fix(environment): preserve initially deleted item observations\n\n* fix(environment): index stored deleted entities separately\n\n* fix(environment): replay lists that include deleted records\n\n* feat(environment): serve sorted creates, listed references and toggles\n\nA create a whole listing placed last is placed again by the sort a later\nlisting shows. A field holding the entities a sent list of ids names is a\nreference with `many`, and a create that sent the member empty agrees with\none that named entities. A scenario request whose body Playwright did not\nexpose and that names no Content-Type sent no body. An item action calls\nshow flipping a boolean both ways learns a `toggle` rule. Skill 55 asks\nrecordings to run an action twice on one object.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): count a sequence number a create sends, as replay does\n\nServing now records a number a call sends for a `sequence` with `sent` in the\nsame count history it generates from, so after that entity is deleted the next\ngenerated number still follows it, as replay's takeSequences does.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): record the final gate run in the verification\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): make no count of a made-object member earlier creates held alike\n\nA count only a later create shows starts at the exemplar's value, which is\nright only while the exemplar is the one create accepted: creates accepted\nafter it showed the member unchanged, which a count would have moved. The\nmerge now refuses such a count, as the top-level sequence check does.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): restate the verification after merging #7539\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): check PUT defaults against reads, and respell update clocks by serving's rule\n\nA default a PUT learns must also agree with what the read after an earlier or\nthe current call showed for the member its answer left out, so a call whose\nread showed the member kept withholds a later clearing default.\n\nReplay and serving now choose an update clock's stored spelling by one rule,\nreadSpellsCoarser: the read after it at a coarser precision in the same zone\nand separator. A read in another zone or separator is no longer adopted by\nreplay, which serving could not store, and a create's plain clocks stay as\nanswered, as serving makes them.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep sorts earlier listings ruled out, and empty added references\n\nA sort a whole listing that placed a create did not follow stays ruled out for\nthat create, though the entity that showed it is later deleted. A create that\nsends a reference's member empty after a later create added the reference\nagrees with it, as with a reference the first create showed.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): restate the verification after the review round\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): leave out a reference the observed create left out\n\nA create the plan observes that left out a reference's member stored no such\nfield, so a served call leaving the member out stores none either, though a\nlater recorded create sent it empty; a call sending it empty still stores that.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): restate the verification after #7539 merged main\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep the largest sequence value in replay, and store update clocks by the kept read\n\nReplay now keeps the largest value a sequence took, as serving's commitWrite\ndoes, so a lower sent value no longer lowers the next number.\n\nServing stores every update's clocks in the spelling of the read the plan\nkeeps as observation.read; replay now does the same through\nreadSpelledClocks, instead of adopting each update's own read, so a later\nupdate whose read spells its clock otherwise contradicts the plan. The plain\nclock branch of restampedFields, which no caller used any more, is gone.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(environment): restate the verification after merging #7539 3b800a10\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(environment): keep learned sorts, references, and toggles faithful\n\nDo not adopt a sort an earlier update already ruled out. Learn a list\nreference only when every element shows the same nonempty fields. Promote\na toggle only when every call started from a boolean.\n\n* test(environment): compare list-reference fields with matching values\n\nThe mixed-field case uses the held tag's color, so rejection comes from\nthe field set rather than a value the recording never stored.\n\n* test(mcp): assert bundle path issues by field\n\nThe compare_bundles rejection reports each relative path as an\ninvalid_format issue instead of one joined diagnostic sentence.\n\n* test(mcp): assert field issues for bundle paths and Dart ABI\n\nRelative bundle paths and rejected ABI selectors are reported as\ninput issues on those fields, not as one joined diagnostic sentence.\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\nCo-authored-by: Cursor Agent ", + "parents": ["01e00dae72e1dbac91b2f5d9997d5e0b8091ad3a"], + "authors": [ + { + "name": "Edgar Arakelyan", + "email": "edgar.arakelyan@scale.com", + "user": { + "login": "earakely-scale", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7600] + }, + { + "sha": "1ef5918179d3cb77b8868bd117de662cbd7099ab", + "subject": "fix(browser): preserve source-map declaration uncertainty (#7945)", + "body": "fix(browser): preserve source-map declaration uncertainty (#7945)\n\n* fix(browser): preserve source-map declaration uncertainty\n\n* style(tests): fix CI formatting\n\n* fix(browser): retain known source map differences\n\n* fix(web): bind map comparisons to script metadata\n\n* fix(browser): match source maps with partial script metadata\n\nKeep each script's observed hash and declaration constraints instead of\ndropping a metadata field for the whole URL group.\n\n* test(flutter): assert ABI selector refusals as structured issues\n\nMCP input validation reports the ABI path and the schema message separately.\nThe old concatenated \"abi: ...\" sentence is no longer the delivered error.\n\n* fix(web): prove large source-map changes without factorial search\n\nGroups larger than eight scripts were reported as unexplained, so nine\nx.map declarations plus one omission compared as unknown against ten\ny.map declarations. Declaration counts reject impossible placements, and\naugmenting paths assign the rest without retrying identical scripts.\n\n* test(mcp): assert bundle path issues by field\n\ncompare_bundles reports each relative path as an invalid_format issue\ninstead of one joined diagnostic sentence.\n\n* fix(web): match repeated source-map scripts by count\n\nIdentical declarations share one group, and a shared omission pool is\ncounted once. A 2000-script self-compare no longer builds a dense\nassignment graph.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["51ad84516e55153c2d22704044f6d2b7de8a6fb4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7945] + }, + { + "sha": "6fa48f201f932c6c12b540ee9799895a0a436d00", + "subject": "docs(apk): clarify rotated signer agreement (#7936)", + "body": "docs(apk): clarify rotated signer agreement (#7936)\n\n* docs(apk): clarify rotated signer agreement\n\n* test(mcp): assert bundle path issues by field\n\ncompare_bundles reports each relative path as an invalid_format issue\ninstead of one joined diagnostic sentence.\n\n* fix(javascript): ignore worker frames for a different source job\n\nA failure frame for another job was dequeued as an output error, so a\nlater caller abort lost the race and was not reported as cancellation.\n\n* test(flutter): assert ABI selector refusals as structured issues\n\ninspect_dart_aot reports the ABI label as an issue on path abi. The\nmessage is the selector contract, without an abi: prefix.\n\n* fix(javascript): check each worker frame condition once\n\nA ready frame is rejected on its own. A non-ready frame for another job\nkeeps waiting. The following id comparison repeated that skip, so it\nnever ran.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["1ef5918179d3cb77b8868bd117de662cbd7099ab"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7936] + }, + { + "sha": "5c05eb88e577843c68946f4c7fcf93a3a2547c22", + "subject": "fix(javascript)!: preserve operator influence in semantic traces (#7939)", + "body": "fix(javascript)!: preserve operator influence in semantic traces (#7939)\n\n* fix(javascript)!: preserve operator influence in semantic traces\n\n* test(javascript): align semantic influence regressions\n\n* style(javascript): format semantic IR\n\n* test(javascript): follow literal argument seed influence\n\n* fix(javascript): keep one literal node per operator operand\n\nReuse an existing literal for operator influence, and treat TypeScript\nassertion wrappers as transparent when deciding whether a call result is used.\n\n* test(mcp): assert bundle path issues by field\n\ncompare_bundles reports each relative path as an invalid_format issue\ninstead of one joined diagnostic sentence.\n\n* fix(javascript): index operator literals by range and initializer\n\nRepeated string operands rescanned every retained literal and every\ninitializer flow. Lookup now uses those indexes, and a 1200-declaration\nfile still projects one literal per operand.\n\n* fix(javascript): keep literal and call facts on their own occurrences\n\nOperator literals match their own source range, so a nested function does\nnot inherit the enclosing declaration's literal. A direct argument still\nreaches the call, while the assigned result follows modeled returns.\nfor-loop initializers and updates are discarded call results.\n\n* test(javascript): expect conditional operand literals beside binding values\n\nA conditional binding keeps one candidate literal per union value and one\noperator literal per operand token. Those are different facts, so the\naggregate payload check counts four nodes and compares literal seeds in\nquery order.\n\n* perf(javascript): index call return flows by call site\n\nprojectCalls filtered every call return for each assigned result. Group\nthose flows once while projecting returns-to-call edges.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["6fa48f201f932c6c12b540ee9799895a0a436d00"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7939] + }, + { + "sha": "22cab8215ab81730c078e63368721ad26e57b8ca", + "subject": "feat(artifacts): inspect and extract .NET single-file bundles (#3787)", + "body": "feat(artifacts): inspect and extract .NET single-file bundles (#3787)\n\n* feat(artifacts): inventory and extract .NET single-file bundles\n\n* fix(artifacts): retain bundle source I/O failure reasons\n\n* docs(artifacts): record Linux bundle regression verification\n\n* fix(artifacts): preserve bundle source failures and cancellation\n\n* docs(artifacts): record synchronized bundle verification\n\n* fix(artifacts): bind bundle extraction to inventoried host\n\n* docs(artifacts): record bundle verification outcome\n\n* fix(artifacts): bound bundle paths and suggest extraction\n\n* fix(artifacts): preserve nested executable container boundaries\n\n* test(artifacts): verify projected .NET members and simplify extraction admission\n\n* fix(artifacts): explain fixed bundle limits at their producing boundary\n\n---------\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["5c05eb88e577843c68946f4c7fcf93a3a2547c22"], + "authors": [ + { + "name": "记得吃中饭", + "email": "17373302683@163.com", + "user": { + "login": "Zhong-fan", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [3787] + }, + { + "sha": "e124bdfc54707da138a58ae61b901f0bf93a9bac", + "subject": "fix(cli): preserve literal Markdown rendering (#7938)", + "body": "fix(cli): preserve literal Markdown rendering (#7938)\n\n* fix(cli): preserve literal Markdown rendering\n\n* fix(cli): retain literal Markdown attributes\n\n* fix(cli): preserve literal punctuation in markdown\n\n* test(cli): update escaped empty object expectations\n\n* style(cli): format the literal empty-object Markdown expectation\n\n* test(mcp): assert bundle path issues by field\n\ncompare_bundles reports each relative path as an invalid_format issue\ninstead of one joined diagnostic sentence.\n\n* test(flutter): assert ABI selector refusals as structured issues\n\ninspect_dart_aot reports the ABI label as an issue on path abi. The\nmessage is the selector contract, without an abi: prefix.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["22cab8215ab81730c078e63368721ad26e57b8ca"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7938] + }, + { + "sha": "34577eb1cc264000a176ded68e5ebf8aba430edd", + "subject": "fix(filesystem): preserve undecodable symlink targets (#7935)", + "body": "fix(filesystem): preserve undecodable symlink targets (#7935)\n\n* fix(firmware): preserve symlink target bytes\n\n* fix(apple): preserve undecodable dylib link targets\n\n* style(tests): fix CI formatting\n\n* test(firmware): select the named contract directly\n\n* test(firmware): record raw bytes for a decodable symlink target\n\n* test(mcp): assert bundle path issues by field\n\ncompare_bundles reports each relative path as an invalid_format issue\ninstead of one joined diagnostic sentence.\n\n* test(firmware): stat raw links without following them\n\naccess follows a symlink, so a published dangling raw-link still looked\nabsent. lstat and readlink inspect the link itself.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["e124bdfc54707da138a58ae61b901f0bf93a9bac"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7935] + }, + { + "sha": "b3d31ed106c6f3baef1dc778ea688c23323879ba", + "subject": "fix: preserve nullable source-map facts and streamline model tests (#8018)", + "body": "fix: preserve nullable source-map facts and streamline model tests (#8018)\n\n* test: repair MCP validation assertions and reuse model sessions\n\n* test(ci): audit constrained guidance bundle fingerprints\n\n* fix(browser): distinguish empty and absent source-map declarations\n\n* refactor(browser): encode script metadata groups once\n\n* test: assert structured path errors without freezing prose", + "parents": ["34577eb1cc264000a176ded68e5ebf8aba430edd"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8018] + }, + { + "sha": "a108a1b817f1cd803448f6ba756883d84c7f630c", + "subject": "fix(cli): report incomplete debugger cleanup as typed outcomes (#8021)", + "body": "fix(cli): report incomplete debugger cleanup as typed outcomes (#8021)\n\n* fix(cli): report incomplete debugger cleanup as typed outcomes\n\ndebug-with-gdb and debug-with-rizin hand-rolled final cleanup in\ntry/finally blocks: a failed or interrupted final close only logged\nand assigned the process exit status, so callers still received\ncomplete successful Evidence with no typed error or partial\nobservation.\n\nBoth commands now route through the shared close owner used by the\nother one-shot CLI commands (deliverCliAnalysisEvidence /\nfinishAnalysisCommand) via a small closeDebuggerCommandSession\nhelper. A rejected closeAll projects as ProviderCleanupError, which\nthe owner turns into cleanup_incomplete retaining the completed\nEvidence as partial observation; a signal observed after finalization\nprojects as cancelled with the same retained observation. The\nper-session close failure still only logs, preserving the rule that\nthe retained owner's closeAll decides completion.\n\nFixes #7378. Fixes #7429.\n\n* test(cli): reject unmodeled GDB requests in cleanup regressions\n\n* test(cli): match modeled GDB requests exactly\n\n* Update tests/boundary/cli/gdbStartupCleanupCli.test.ts\n\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>\n\n---------\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>", + "parents": ["b3d31ed106c6f3baef1dc778ea688c23323879ba"], + "authors": [ + { + "name": "Rohit Ghumare", + "email": "48523873+rohitg00@users.noreply.github.com", + "user": { + "login": "rohitg00", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "greptile-apps[bot]", + "email": "165735046+greptile-apps[bot]@users.noreply.github.com", + "user": { + "login": "greptile-apps[bot]", + "__typename": "User" + } + } + ], + "pullRequests": [8021] + }, + { + "sha": "cac6e0613e314238999ce4cc0249107ae936e8d3", + "subject": "fix(ci): enforce architecture guards before dependency setup (#8027)", + "body": "fix(ci): enforce architecture guards before dependency setup (#8027)\n\n* fix(ci): enforce architecture guards before dependency setup\n\n* test(ci): bind cache policy to preceding Node setup", + "parents": ["a108a1b817f1cd803448f6ba756883d84c7f630c"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8027] + }, + { + "sha": "8188497f13477918f2b696689c3598b65f11a7c5", + "subject": "feat(artifacts): inspect and extract Bun standalone module graphs (#6998)", + "body": "feat(artifacts): inspect and extract Bun standalone module graphs (#6998)\n\n* feat(artifacts): inventory and extract Bun standalone executable module graphs\n\nAdds a Bun standalone artifact reader for Mach-O, PE, ELF and appended\ntrailers, supporting the 36-byte and 52-byte module record layouts. It\npreserves module names, entry-point details and raw metadata, and\nexposes contents, sourcemaps, bytecode and module-info as separate\nentries for safe extraction without executing the binary. Parsing\nrejects malformed or ambiguous graphs and enforces module-count,\nretained-byte and expansion limits. Adds synthetic parser tests, CLI and\nMCP coverage, agent skill guidance, and a verification script for\nBun-produced executables.\n\nCo-Authored-By: Claude Opus 5.5 \nClaude-Session: https://claude.ai/code/session_016y53PdpyMAp9RSW65fatHe\n\n* fix(artifacts): bound Bun section probes and reject truncated sections\n\nSplit Bun recognition into a bounded probe that reads only section\nheaders, length prefixes, and the Offsets/trailer suffix, and a single\npayload load used by the reader. Inventory classification and extraction\nadmission no longer allocate the whole graph.\n\nMatch ELF `.bun` section names by comparing only the name bytes and\nterminator, so many headers sharing one long name cost constant work each.\nReject sections whose declared extent ends past EOF instead of reading a\nsilently shortened window.\n\nLaunch Bun, Docker, and REA in the standalone verifier through the shared\nowned verifier commands, and release the runtime root only after those\ncommand families have settled.\n\nCo-Authored-By: Claude Opus 5.5 \nClaude-Session: https://claude.ai/code/session_016y53PdpyMAp9RSW65fatHe\n\n* style(artifacts): format Bun reader integration\n\n* fix(contracts): describe static Bun inventory facts\n\n* fix(artifacts): bound Bun metadata reads and combined path growth\n\n---------\n\nCo-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["cac6e0613e314238999ce4cc0249107ae936e8d3"], + "authors": [ + { + "name": "Matt Van Horn", + "email": "mvanhorn@users.noreply.github.com", + "user": { + "login": "mvanhorn", + "__typename": "User" + } + }, + { + "name": "Matt Van Horn", + "email": "455140+mvanhorn@users.noreply.github.com", + "user": { + "login": "mvanhorn", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [6998] + }, + { + "sha": "ec4a0a01c42277a331463cb81235567ff02483ea", + "subject": "fix(hopper): reconcile observed caller relationships (#7953)", + "body": "fix(hopper): reconcile observed caller relationships (#7953)\n\n* fix(hopper): reconcile observed caller relationships\n\n* fix(hopper): retain completed caller scans on failure\n\nAttach the native reply and collected forward facts when reconciliation\nfails or is cancelled, and check scan stop codes separately from their\nwording. Live observations keep REA evidence ids rather than provider\nsupplied ones, and the real Hopper verifier uses advertised MCP schemas.\n\n* fix(hopper): answer caller-scan methods in the package fixture\n\nThe packaged Hopper stand-in echoed unknown bridge methods, so\nanalyze_function rejected rea_caller_scan_target as an invalid scan\ntarget and the native package baseline returned unreadable_output.\n\n* fix(hopper): share caller identities in failed scan observations\n\nFailure partials repeated each caller identity under every destination.\nThe page budget counted compact replies, then schema parsing copied the\nexpanded form. Identities are stored once and destinations cite addresses.\n\n* refactor(config): own the Hopper caller-scan budget default\n\nThe environment schema hard-coded the 2000 ms scan default. The domain\nlimit owner now names that millisecond budget and the schema reuses it.\n\n* test(mcp): assert bundle path issues by field\n\ncompare_bundles reports each relative path as an invalid_format issue\ninstead of one joined diagnostic sentence.\n\n* test(flutter): assert ABI selector refusals as structured issues\n\ninspect_dart_aot reports the ABI label as an issue on path abi. The\nmessage is the selector contract, without an abi: prefix.\n\n* fix(session): retain caller observations that cannot be replayed\n\nA missing document selector blocks snapshot replay. Backward call-graph\nand trace reads still keep the native result and forward observations,\nand the workflow Evidence links those records.\n\n* fix(session): keep decompile bodies out of the in-memory ledger\n\nCaller and callee walks still stay in Evidence without a document.\nprocedure_pseudo_code does not, so decompile_all leaves each body in the\nfile-backed export instead of retaining the whole export in memory.\n\n* fix(hopper): own caller-scan recovery and the page byte allowance\n\nScan facts stay in the domain. Environment recovery, including the time\nbudget bounds and the fixed allowances with no runtime override, is\nappended from configuration. Setup forwards the budget, and the bridge\nuses one byte allowance for instructions, native callers, and pages.\n\n* fix(hopper): retain compact caller references within the scan budget\n\nRecovered call sites stay in the address form the scan already counted.\nExpanded identity copies are measured before allocation and refused when\nthey exceed the retention budget. Instruction lists are not part of the\nretained reply.\n\n* fix(session): omit instruction payloads from retained caller evidence\n\nDocumentless caller and callee reads stay in the ledger for the session.\nTheir evidence keeps call sites and drops instruction lists the scan\nalready consumed.\n\n* fix(hopper): keep the owning caller address on each compact call site\n\nA page reference marked source_procedure \"caller\" belongs to that page\nitem's caller. Saved sites record that address, and an owner missing from\nthe callee inventory is stored once instead of copied onto every site.\n\n* fix(session): leave Hopper reply shaping to the Hopper adapter\n\nDocumentless caller evidence stores the adapter's raw result unchanged.\nThe session no longer reads native_result.instructions.\n\n* test(hopper): throw typed scan failures before reading results\n\nSuccessful caller-scan results now throw the typed error instead of\nreturning after an ok check. Expected failures assert structured tags,\nstop codes, and reported limits.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["8188497f13477918f2b696689c3598b65f11a7c5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7953] + }, + { + "sha": "539a494d25df3dc68e8d7bbadeea7edb527c4884", + "subject": "docs(setup): restore target and Hopper launch settings (#7902)", + "body": "docs(setup): restore target and Hopper launch settings (#7902)", + "parents": ["ec4a0a01c42277a331463cb81235567ff02483ea"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7902] + }, + { + "sha": "bf115be2cd900724a5bbd59a5cefc7af1dc2576f", + "subject": "fix(evidence)!: report storage publication limits (#7887)", + "body": "fix(evidence)!: report storage publication limits (#7887)\n\n* fix(evidence): report storage publication limits\n\n* test(evidence): cover staged storage failure cleanup", + "parents": ["539a494d25df3dc68e8d7bbadeea7edb527c4884"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7887] + }, + { + "sha": "845080aef61b4e1b0d051da8f873f4cd00d20f1b", + "subject": "fix(session): align resource-only status and snapshot recovery (#7896)", + "body": "fix(session): align resource-only status and snapshot recovery (#7896)\n\n* fix(session): align resource-only status and snapshot recovery\n\n* fix(session): report independent workflows during resource sessions\n\n* test(mcp): honor SQLite runtime availability\n\n* test: compare resource snapshot guidance with its formatter\n\nAssert projected error codes and the owning remediation action for\nresource-session snapshot refusals, and type MCP error text as a closed\ncontent item.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["bf115be2cd900724a5bbd59a5cefc7af1dc2576f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7896] + }, + { + "sha": "c0c3902207d6b1a33709e42b80c7e570da7db964", + "subject": "fix(native): preserve Mach-O target selection in macOS tools (#7831)", + "body": "fix(native): preserve Mach-O target selection in macOS tools (#7831)\n\n* fix(native): preserve Mach-O target selection in macOS tools\n\n* fix(native): retain exact Mach-O slice signature coverage\n\n* fix(native): admit x86_64 LIB64 signature selectors\n\n* test(native): match signature checks to actual slices\n\n* fix(native): recognize vtool refusals on private Mach-O aliases\n\nMatch vtool's container refusal to the operand the command received so a\nparenthesized universal path keeps completed facts and the refusal\nlimitation. Expect codesign -a only when the target format is universal.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["845080aef61b4e1b0d051da8f873f4cd00d20f1b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [7831] + }, + { + "sha": "da5ec6b62c1631dcc8cdcea66c3ac7d9b076e0f3", + "subject": "fix(macho): preserve literal segment name BOMs (#8040)", + "body": "fix(macho): preserve literal segment name BOMs (#8040)", + "parents": ["c0c3902207d6b1a33709e42b80c7e570da7db964"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8040] + }, + { + "sha": "1da304b28213ca7a50f6787eae716abe73c4e628", + "subject": "fix(adb): verify pushes to long device paths (#8047)", + "body": "fix(adb): verify pushes to long device paths (#8047)\n\n* fix(adb): verify pushes to long device paths\n\nsha256sum echoes the device path, so a correct digest line for a path\nnear 1 KiB exceeded the fixed 1 KiB capture budget. The resulting\nresource failure was then reported as device_digest_source \"unavailable\",\nthe same outcome as a device without sha256sum. Size the budget to the\npath, and return a capture-budget failure as a resource constraint\ninstead of an unverified success.\n\nFixes #3369\n\n* Keep adbDeviceAnalysis.ts as on main\n\n* test(adb): keep only the long-path digest test\n\nMain already covers an oversized checksum answer as a resource\nconstraint with the completed push retained.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["da5ec6b62c1631dcc8cdcea66c3ac7d9b076e0f3"], + "authors": [ + { + "name": "HawkForge", + "email": "75696486+HawkForge@users.noreply.github.com", + "user": { + "login": "HawkForge", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8047] + }, + { + "sha": "1c14f663560e674fdce0556dda2ffb3a72cc006f", + "subject": "refactor(contracts): register CLI and MCP tools by family id (#8051)", + "body": "refactor(contracts): register CLI and MCP tools by family id (#8051)\n\n* refactor(contracts): register CLI and MCP tools by family id\n\nWalk the published tool-family list once for each adapter so a new\nfamily id must supply both a CLI registrar and an MCP registrar.\n\n* fix(cli): keep family registration off the contract tables\n\nWalk family ids from the startup-safe list, and register the web script\ncommands with the application family that owns their MCP contracts.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["1da304b28213ca7a50f6787eae716abe73c4e628"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8051] + }, + { + "sha": "5f9187cd279084581fd8c333ba4c6c2c8c506c11", + "subject": "refactor(artifacts): describe formats in one registry (#8054)", + "body": "refactor(artifacts): describe formats in one registry (#8054)\n\n* refactor(artifacts): describe formats in one registry\n\nReader construction, classification retention, container role, and\nextraction now read one descriptor per domain format id. unknown has\nno reader, and zip package families share one capability row.\n\n* fix(artifacts): keep reader presence in format descriptor types\n\nDescriptor helpers no longer widen every format to an optional reader,\nso ArtifactReaderFormat stays the union of formats that construct one.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["1c14f663560e674fdce0556dda2ffb3a72cc006f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8054] + }, + { + "sha": "b894be6361d8db3bc402080719c74bb0bb27349b", + "subject": "fix(native)!: report NativeAOT failures as reason codes (#8053)", + "body": "fix(native)!: report NativeAOT failures as reason codes (#8053)\n\n* fix(native)!: report NativeAOT failures as reason codes\n\nPeImage admission failures and parser recoveries used to publish\nError.message as NativeAotReport.reason. The report is now a union on\nstatus, and reason is a typed code with the fields that code needs.\nComplete reports keep reason null and a located header. Partial and\nnot_applicable reports carry a code. Caller budget mistakes throw\nAnalysisInputError or AnalysisResourceConstraintError with a diagnostics\ncode instead of a bare Error.\n\n* fix(native): keep out-of-domain hydration pointers partial\n\nAn inline pointer outside the unsigned 64-bit domain made\nwriteBigUInt64LE throw RangeError, and the hydration catch rethrew it\ninstead of recording a partial report. Those targets are now an\nadmission detail. The load-image summary schema still accepts the\noptional Ghidra extension's string reason.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["5f9187cd279084581fd8c333ba4c6c2c8c506c11"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8053] + }, + { + "sha": "fa1aa64ce4d68ee417e0d7869e205afa16e5cbfb", + "subject": "fix(errors): store resource-constraint recovery as one shape (#8055)", + "body": "fix(errors): store resource-constraint recovery as one shape (#8055)\n\n* fix(errors): store resource-constraint recovery as one shape\n\nAnalysisResourceConstraintError kept remediationAction, fixedAllowance,\nand retryable as independent optionals, so a refusal could claim both a\nfixed allowance and a separate remediation. The constructor now stores\nthe existing ResourceConstraintRecovery union, and the three accessors\nread that object.\n\n* test(errors): cover competing resource-constraint recovery fields\n\nA runtime options object can still carry both a fixed allowance and a\nremediation action. The constructor keeps the allowance and drops the\nother field; the regression now supplies both.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["b894be6361d8db3bc402080719c74bb0bb27349b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8055] + }, + { + "sha": "a4c183b750c942ee09c8f7d11db0c9e5dcfb62d6", + "subject": "refactor(adb): move device and client operations out of the provider switch (#8062)", + "body": "refactor(adb): move device and client operations out of the provider switch (#8062)\n\n* refactor(adb): move device and client operations out of the provider switch\n\nKeep AdbProvider as the session owner. Device listing, device inspection,\nand client identity now run in AdbDeviceOperations, and shared listing\nexecution construction lives next to the client identity result.\n\nCo-authored-by: morluto \n\n* refactor(adb): use the shared client and provider identity types\n\nDrop the ClientIdentity and ProviderIdentity aliases so method signatures\nname AdbClientResult and AdbProviderIdentity directly.\n\nCo-authored-by: morluto \n\n---------\n\nCo-authored-by: Cursor Agent \nCo-authored-by: morluto ", + "parents": ["fa1aa64ce4d68ee417e0d7869e205afa16e5cbfb"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8062] + }, + { + "sha": "b663c79552fe10f3bf7c6f4291eebb1580f8cd31", + "subject": "fix(domain): replace bare parser errors with typed codes (#8057)", + "body": "fix(domain): replace bare parser errors with typed codes (#8057)\n\n* fix(domain): replace bare parser errors with typed codes\n\nOpenStep syntax, canonical JSON digests, managed-graph source checks,\nframe fingerprints, and reference-flow invariants threw Error and\npublished the sentence. Each refusal now carries a code. Tests assert\nthat code, including OpenStep position, instead of the previous prose.\n\n* test(domain): pin OpenStep refusal codes and positions\n\nThe syntax cases accepted any code and any offset. Each container\nrefusal now expects its code and source position, including the deep\nsuffix that changes (x from unterminated_array to expected_separator.\nScalar failures stay identical to the pinned decoder.\n\n* test(filesystem): assert OpenStep keyed-archive codes\n\nThe deep-suffix keyed archive cases compared ArtifactReaderFailure\nmessage text with the pinned decoder sentence. They now require\nreason format and the OpenStep code and source position on the cause.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["a4c183b750c942ee09c8f7d11db0c9e5dcfb62d6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8057] + }, + { + "sha": "395b5983837ed721c821f40befb2919995e3d46e", + "subject": "refactor(admission): own inspector, web, and CLI state per host (#8058)", + "body": "refactor(admission): own inspector, web, and CLI state per host (#8058)\n\n* refactor(admission): own inspector, web, and CLI state per host\n\nReplace the process-global inspector, web-bundle, guidance, and JavaScript\ncounters with objects a host passes in, so independent instances do not\nshare admission or cleanup.\n\n* fix(admission): keep worker and file cleanup on the host\n\nWeb-bundle and JavaScript workers retry only their host registry, and\neach Inspector admission authorizes and closes its own file scope.\nBrowser providers can share one web-bundle admission.\n\n* test(inspector): gate one admission's file cleanup\n\nThe isolation test delayed the first ArtifactResourceScope.retryCleanup\ncall, so a second call on a shared ElectronFileScope still finished.\nHold first.files.retryCleanup until the other admission's close\nfinishes, then release and join before restoring the method.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["b663c79552fe10f3bf7c6f4291eebb1580f8cd31"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8058] + }, + { + "sha": "4a8d8f72b354dc96a8d1bce06da4bf6c7eda33ec", + "subject": "feat(debugger): share GDB and Rizin session caps as REA_ settings (#8056)", + "body": "feat(debugger): share GDB and Rizin session caps as REA_ settings (#8056)\n\n* feat(debugger): share GDB and Rizin session caps as REA_ settings\n\nMove the duplicated deadline guidance into the owned debugger helper and\nreplace the shared session, queue, output, and 120s command caps with\nlaunch settings that name their value, source, and range.\n\n* test(gdb): assert the command-output setting on truncated exit evidence\n\nThe retained-output limitation now names REA_DEBUGGER_MAX_COMMAND_OUTPUT_BYTES\ninstead of the old fixed-cap sentence.\n\n* test(gdb): assert command-output limit fields on truncated exit\n\nA truncated GDB exit now carries the command-output setting, value, and\nsource on the cleanup error. The coverage test reads those fields.\n\n* fix(debugger): keep control replies and evidence hashes inside their budgets\n\nPoint the session-cap mutation target at DEFAULT_DEBUGGER_MAX_SESSIONS.\nGive startup and cleanup replies a fixed 16 MiB budget so a small caller\noutput cap cannot truncate them. Lower the command-output maximum so\nescaped Evidence JSON stays under Node's string ceiling, and keep GDB\nstartup timeout diagnostics when the error is rebuilt.\n\n* test(debugger): throw typed Result errors before success checks\n\nSuccess cases no longer assert ok and return. They throw the typed\nerror first, then check session, deadline, and close fields.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["395b5983837ed721c821f40befb2919995e3d46e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8056] + }, + { + "sha": "940d71a45aadd9e6b90977396f48b17928fa6154", + "subject": "refactor(analysis-view): break the analysis view hub cycle (#8061)", + "body": "refactor(analysis-view): break the analysis view hub cycle (#8061)\n\n* refactor(analysis-view): break the analysis view hub cycle\n\nMove request fragments, the request union, and the result union out of\nanalysisView.ts so projectors no longer import the module that imports them.\nThe dispatcher re-exports the public schemas and seals projector results.\n\nCo-authored-by: morluto \n\n* fix(analysis-view): check inferred projector results\n\nRequire each projector result to match the unsigned result union before\nsealing it, and parse the cycle guard's imports with Babel so comments\nand side-effect imports are not misread.\n\n* fix(analysis-view): close IL2CPP and Android symbol view inputs\n\nAdmit those projectors through AdmittedView and check test selections\nagainst their request schemas, so misspelled fields fail at the call site.\n\n---------\n\nCo-authored-by: Cursor Agent \nCo-authored-by: morluto ", + "parents": ["4a8d8f72b354dc96a8d1bce06da4bf6c7eda33ec"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8061] + }, + { + "sha": "249b90c5e3007dac318a17112b8ec4f3ecb88ed5", + "subject": "refactor(javascript): break the semantic analysis import cycle (#8063)", + "body": "refactor(javascript): break the semantic analysis import cycle (#8063)\n\n* refactor(javascript): break the semantic analysis import cycle\n\nSplit shared semantic facts out of the analysis hub so projectors of\neffects, evaluation, and identity no longer import one another in a cycle.\n\n* refactor(javascript): share the import specifier reader\n\nRead static imports in one module used by the boundary checker and both\ncycle guards, so those rules cannot drift apart.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["940d71a45aadd9e6b90977396f48b17928fa6154"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8063] + }, + { + "sha": "3b647132c6221f644cac620016b7cf0a2b548549", + "subject": "fix(kuna): report document failures as typed codes (#8064)", + "body": "fix(kuna): report document failures as typed codes (#8064)\n\n* fix(kuna): report document failures as typed codes\n\nKuna JSON, graphs, xrefs, spans, and command checks threw Error and\npublished the sentence. Those refusals are now KunaDocumentError codes\nwith the field or path that failed. Output errors keep the code as\nreason and the same facts in diagnostics.\n\n* fix(kuna): keep incoming-reference address fields\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["249b90c5e3007dac318a17112b8ec4f3ecb88ed5"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8064] + }, + { + "sha": "317bf3fe235e655b2d752d3be261cc0da7d00f2b", + "subject": "fix: report provider admission failures as typed codes (#8066)", + "body": "fix: report provider admission failures as typed codes (#8066)\n\n* fix: report provider admission failures as typed codes\n\n* fix(evm): keep limiter path on admission diagnostics\n\n* fix: assert WABT and CBOR admission codes\n\n* fix: keep admission details on returned failures\n\n* fix(evm): detect repeated CBOR keys in the decoder\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["3b647132c6221f644cac620016b7cf0a2b548549"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8066] + }, + { + "sha": "bfa082f77774a33f4a7d72ed6570429d9d294dc7", + "subject": "fix(analysis-view): keep inferred confidence on views of inferred Evidence (#8099)", + "body": "fix(analysis-view): keep inferred confidence on views of inferred Evidence (#8099)\n\ncreateAnalysisViewEvidence chose view confidence from the view result kind\nonly, so every summary, page or item view of an inferred parent\n(compare_source_to_bundle, inspect_evm_interface, partially resolved\ninspect_il2cpp_metadata) was sealed as derived while keeping the parent's\nauthority. A projection never makes its facts more certain: an inferred\nparent now yields inferred views through CLI and MCP alike. Observed and\nderived parents keep their existing view confidence and identities.\n\nFixes #8098\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["317bf3fe235e655b2d752d3be261cc0da7d00f2b"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8099] + }, + { + "sha": "6d19649c0bd20835ced96660edb22d9270789402", + "subject": "fix(apple): read flattened framework Info.plist from Resources (#8101)", + "body": "fix(apple): read flattened framework Info.plist from Resources (#8101)\n\nA macOS framework without Versions/ keeps its binary, _CodeSignature/ and\nResources/Info.plist directly in the .framework, as Electron and Gecko apps\nship it. Bundle anatomy looked for a shallow bundle's plist only at its root\nand reported info_plist_path: null under complete coverage.\n\nResolve a shallow bundle's root Info.plist first, then Resources/Info.plist,\nthe same layout a framework version directory uses. Keep the iOS platform\nrule tied to a root-level Info.plist so a Resources/-only application root\nis not classified as iOS.\n\nFixes #8100\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["bfa082f77774a33f4a7d72ed6570429d9d294dc7"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8101] + }, + { + "sha": "0ce76e70f4b9f9b33a9527239cf58002490d08dd", + "subject": "fix(desktop): charge retained rows at their measured representation (#8105)", + "body": "fix(desktop): charge retained rows at their measured representation (#8105)\n\n* fix(desktop): charge retained rows at their measured representation\n\nThe desktop scan reserved 1024 + 24 bytes per path character for every\nrow, omission and the root against its 32 MiB representation budget. Real\nrows cost 800-940 heap and 490-640 JSON bytes, so the charge overstated\nthem 6-13 times and large macOS bundles stopped at 3,700-7,200 entries,\nfar below max_entries.\n\nCharge each path at the larger of its UTF-16 heap size and its escaped\nJSON size, plus the existing fixed row and omission overheads, in one\nhelper. The bound still covers the retained heap and the serialized\nreport, including control-character paths that expand six times in JSON.\n\nFixes #8104\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(desktop): charge every retained copy of a path\n\nThe tighter row charge counted each path once, but rows repeat it in\nconvention-fact values and the next probes those facts offer, and host\nfailure issues name the absolute path. Control-character paths under a\nconvention such as Content/Paks or resources/app.asar therefore serialized\n47-80 MiB of reports within the 32 MiB budget.\n\nReserve each copy through the same text helper where it is stored: path\nconvention facts with their row, the probes any fact offers (at most two,\npinned by a projection test) with that fact, retained read ranges before\ntheir read, and probe failure issues before they are recorded.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["6d19649c0bd20835ced96660edb22d9270789402"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8105] + }, + { + "sha": "24398a89e451f79c54a9a0ef03ae9182d8c5057e", + "subject": "fix(source-maps): resolve empty sourceRoot sources against the map URL (#8107)", + "body": "fix(source-maps): resolve empty sourceRoot sources against the map URL (#8107)\n\nwebpack 5 and tsc write \"sourceRoot\": \"\" for map-relative sources. Since\n5f702dd6c the shared join added \"/\" for any non-null root, so these\nsources resolved from the URL root: rxjs's ../../../src/internal/Observable.ts\nunder /npm/rxjs@7.8.1/dist/cjs/internal/ became /src/internal/Observable.ts,\nand xterm's webpack://xterm/./src/... became https://host/webpack://xterm/....\n\nTreat an empty root like a null root in sourceMapReference, the single join\nused by trace-web-source-location, analyze-javascript-application and the\nweb source-map fetcher. Chrome, Firefox and trace-mapping skip an empty root,\nand tc39/ecma426#183 wrote the current steps to match them. Non-empty roots,\nincluding \"/\" and repeated slashes (#6726), keep their existing behavior.\n\nFixes #8106\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["0ce76e70f4b9f9b33a9527239cf58002490d08dd"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8107] + }, + { + "sha": "9d68aac76db76bad44f6b17ada7c4464a871a331", + "subject": "fix(javascript): stop reporting self-defaulted receivers as module loads (#8109)", + "body": "fix(javascript): stop reporting self-defaulted receivers as module loads (#8109)\n\nThe CommonJS loader search treated any repeated state on its own ancestor\nchain as an unknown loader. A self-default such as\n`session.messages = session.messages || []` forms that cycle, because a\nmember read inside the assigned value was attributed to the later call's\nread site and selected the same write again. Each `push` on the value was\nthen reported as an unresolved `require` load, and graph coverage became\npartial.\n\nRecord a member read inside a flowed value as a depth-1 captured selection\nat its own position, as member mutations already do for flowed origins.\nTreat a revisited state as adding no source; the cycle's other entries are\nstill expanded once each. Remove the superseded ancestor tracking.\n\nFixes #8102\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["24398a89e451f79c54a9a0ef03ae9182d8c5057e"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8109] + }, + { + "sha": "c5f50e80d8032baba7c3f6af4b84f8ce2d49e65d", + "subject": "fix(captures): admit browser-serialized HAR request URLs (#8112)", + "body": "fix(captures): admit browser-serialized HAR request URLs (#8112)\n\n* fix(captures): admit browser-serialized HAR request URLs\n\nhar-schema@2.0.0 checks request.url with ajv-formats' strict RFC 3986\n`uri` format. Browsers record and send URLs as WHATWG serializes them,\nwhich keeps characters such as `|` and `{` unescaped in the query, so one\nGoogle Fonts or GraphQL GET entry made inspect-web-network-capture and\nenvironment-build reject the whole HAR.\n\nHAR 1.2 defines request.url only as the absolute request URL. Own that\ncorrection in the HAR validator: every URL the RFC 3986 check accepts\nstays accepted, and a URL that WHATWG URL serialization reproduces\nunchanged is accepted too. Spellings WHATWG would rewrite (a backslash\nauthority, a tab, a space) and relative references still fail.\n\nFixes #8110\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(captures): state that RFC 3986 request URLs stay admitted\n\nThe HAR request URL rule is \"passes RFC 3986, or WHATWG serialization\nreproduces it unchanged\". A spelling WHATWG would rewrite therefore fails\nonly when it also fails the RFC 3986 check; an uppercase host still\npasses. Say so in the docs and the validator comment, and pin the\naccepted uppercase-host case in the CLI test.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["9d68aac76db76bad44f6b17ada7c4464a871a331"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8112] + }, + { + "sha": "cce33142ede98d39c0ce289931700c8c7a0d9cdc", + "subject": "fix(apple): charge the XML plist decoder's DOM before decoding (#8115)", + "body": "fix(apple): charge the XML plist decoder's DOM before decoding (#8115)\n\n* fix(apple): charge the XML plist decoder's DOM before decoding\n\nThe XML preflight charged 4 bytes per character and 256 bytes per start\nor end tag. The decoder builds an @xmldom/xmldom DOM that measured\n1,000-1,160 bytes per element and up to 240 bytes per text, comment or\nCDATA node, which were not charged at all. A 1.75 MB plist of 230,000\n lines was admitted under the 64 MiB decode budget and peaked at\n249 MiB of heap; shipped Apple plists peaked at 80-104 MiB.\n\nCharge each element and each text, comment, CDATA or DOCTYPE node at a\nmeasured upper bound, keeping the character and number-projection terms.\nThe binary estimator already bounds its decoder and is unchanged.\n\nFixes #8113\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(apple): charge every XML element, attribute and reference\n\nThe XML preflight recognized only element names starting with an ASCII\nletter, so names such as é, _, a CJK or astral character escaped the\nelement charge: 100,000 <é/> elements (0.5 MB) built an 84 MiB DOM before\nthe plist decoder rejected the tag. Attributes and entity or character\nreferences were also uncharged; 20 attributes per element measured about\n210 bytes each, and each reference about 26 bytes beyond its characters.\n\nClassify markup by the character after \"<\" instead of a name pattern, so\nanything other than an end tag, comment, CDATA, PI or declaration counts as\nan element (saxes rejects malformed markup before the DOM is built). Charge\neach unquoted \"=\" in a start tag as an attribute node and every \"&\" as a\nreference.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(apple): charge XML references only where the parser expands them\n\nThe previous commit charged every \"&\" in the document as a reference,\nincluding literal ampersands inside CDATA sections and comments. A valid\nplist with one CDATA string of 1,000,000 ampersands was refused although\nit is a single node the decoder holds as one string.\n\nCount \"&\" during the existing token walk, only in text runs and in the\nattribute values of start tags, so comments, CDATA, PIs and declarations\nadd no reference charge and the scan stays a single pass.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["c5f50e80d8032baba7c3f6af4b84f8ce2d49e65d"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8115] + }, + { + "sha": "d77104daab8b123533cc8c88320ad7a3ea0ed540", + "subject": "fix(fit): preserve leading U+FEFF in property strings (#8083)", + "body": "fix(fit): preserve leading U+FEFF in property strings (#8083)", + "parents": ["cce33142ede98d39c0ce289931700c8c7a0d9cdc"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8083] + }, + { + "sha": "72039ecca99830fa9b7f930719db20b2b6d494cb", + "subject": "fix(environment): retain conflicting scenario MIME uncertainty (#8082)", + "body": "fix(environment): retain conflicting scenario MIME uncertainty (#8082)\n\n* fix(environment): retain conflicting scenario MIME uncertainty\n\n* test(mcp): assert structured absolute-path diagnostics\n\n* test(mcp): assert typed selector and stdio diagnostics", + "parents": ["d77104daab8b123533cc8c88320ad7a3ea0ed540"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8082] + }, + { + "sha": "81378efb71de135b3d896de141610f66ea66338d", + "subject": "fix(electron): keep literal IPC sends ambiguous beside unresolved handlers (#8120)", + "body": "fix(electron): keep literal IPC sends ambiguous beside unresolved handlers (#8120)\n\n* fix(electron): keep literal IPC sends ambiguous beside unresolved handlers\n\nA main handler on an unresolved channel can receive any literal renderer\nsend of a compatible mode, but pairing ignored it unless it had a scoped\nreceiver. The send was then reported unpaired, or paired with another\nhandler. Treat an unresolved-channel handler as a competitor that never\npairs.\n\nThe wrapper pass seeds only calls with a literal first argument, so it now\nrecords which invocations of a dynamic site it traced. The syntax finding\ngains `invocation_channels: \"literal\"` only when every invocation is a\ntraced direct call of an unexported local function supplying a literal\nchannel. Such a site is already represented by its per-invocation findings\nand does not compete.\n\nFixes #8118\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(electron): keep guarded wrapper registrations competing in IPC pairing\n\nA guarded wrapper registration keeps its predicate on a call path and has\nno IPC finding. It still counted toward `invocation_channels: \"literal\"`,\nso pairing lost it: a send on that channel was reported unpaired, or\npaired uniquely with a direct handler. The enumerated site now carries\nthese channels as `guarded_invocation_channels`, and each one competes for\nits own channel without pairing.\n\nIndex each binding's direct call sites by appending in place. Spreading\nthe earlier calls on every reference was quadratic in a file's call count.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["72039ecca99830fa9b7f930719db20b2b6d494cb"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8120] + }, + { + "sha": "6b68fb642a62f42e4e5359717e7f2f80b7938c63", + "subject": "fix(ci): remove unused exports that fail deep static checks (#8095)", + "body": "fix(ci): remove unused exports that fail deep static checks (#8095)\n\n* fix(ci): remove unused exports that fail deep static checks\n\nKnip on main reports three analysis-view hub re-exports, two type\nre-exports, an unused artifact-format guard and an alias constant. Drop\nthe dead re-exports and guard, and give the debugger control-reply budget\nits own literal: it is a separate budget from the caller command-output\ndefault, as its comment already states.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(config): read the Rizin control budget from its own constant\n\nThe Rizin control-reply admission limit still took its value from the\ncaller command-output default, while GDB used DEBUGGER_CONTROL_REPLY_BYTES.\nRead the dedicated constant in both so the control budget has one owner.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["81378efb71de135b3d896de141610f66ea66338d"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8095] + }, + { + "sha": "a47dcca010c24ff5020361ba7148f9862151394a", + "subject": "perf(javascript): keep one member-effect record per stored fact (#8103)", + "body": "perf(javascript): keep one member-effect record per stored fact (#8103)\n\nMember-mutation indexing appended a binding write or escape record for\nevery traversal state that reached it. States that differ only in\ncoverage fields the record never stores (origin, owner initializer,\ngetter widening) produced identical records, and each later receiver\nquery rescanned all of them. Record each stored fact once, alongside the\nexisting required-module effect deduplication. Propagation is unchanged.\n\nEffect ordering also re-walked the same top-level statement ancestry for\nevery candidate record. Cache it with the other initializer positions,\nand test the selected path before the costlier receiver comparison.\n\nOn the #7774 reproducer the semantic IR and the complete\nanalyze-javascript-application Evidence are byte-identical, while the\nCLI run drops from 146 s to 40 s.\n\nRefs #7774\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["6b68fb642a62f42e4e5359717e7f2f80b7938c63"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8103] + }, + { + "sha": "37342ecde02ae16db6aa57c3323d1a7367de1b0d", + "subject": "feat(native): open extension, framework, XPC and plug-in bundle directories (#8117)", + "body": "feat(native): open extension, framework, XPC and plug-in bundle directories (#8117)\n\n* feat(native): open extension, framework, XPC and plug-in bundle directories\n\nopen_binary and the CLI inspection commands admitted only .app\ndirectories and pointed every other Apple bundle at the JavaScript\nanalyzer. Resolve .appex, .framework, .xpc, .systemextension, .bundle\nand .plugin directories through their Info.plist CFBundleExecutable, in\nthe Contents or flat root layout, plus the versioned framework layout\nunder Versions/Current. Exactly one layout may declare the bundle and\nevery resolved path must stay inside it.\n\nUnresolvable bundles fail closed with typed constraints, probed paths\nand the Info.plist that was read. Other Apple bundle types are refused as\nunsupported instead of being offered the JavaScript route. Resource-root\ndiscovery shares the same layout rule, so inspect_plist reads a\nversioned framework's Info.plist. The recognized bundle vocabulary now\nhas one owner in the domain.\n\nRefs #4310\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): refuse kernel extensions and state bundle error fields\n\nName the Apple bundle types binary routes recognize but do not open\n(.dext, .kext, .qlgenerator, .mdimporter) explicitly, so a kernel\nextension is refused as unsupported instead of receiving the JavaScript\nroute. Document which bundle refusals carry probed_paths and info_plist,\nand make success tests throw the typed admission error before asserting.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(native): open flattened frameworks through Resources/Info.plist\n\nElectron and Gecko apps ship frameworks without Versions/: the program\nfile sits at the framework root beside Resources/Info.plist, the layout\n#8101 taught bundle anatomy. Read that layout for a framework without\nVersions/, and keep the versioned layout for one with it, so a versioned\nframework's root Resources link is never read as a second declaration.\nThe resource root reports it as flattened-framework.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["a47dcca010c24ff5020361ba7148f9862151394a"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8117] + }, + { + "sha": "6bb831df60d57c48fecaf11ce26efbe64861b7b2", + "subject": "chore(security): configure dependency and ownership reviews", + "body": "chore(security): configure dependency and ownership reviews\n", + "parents": ["37342ecde02ae16db6aa57c3323d1a7367de1b0d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "767f6afc18f19687eef663a10e9a3983f6f9979e", + "subject": "perf(javascript): index member-effect paths for projected reads (#8108)", + "body": "perf(javascript): index member-effect paths for projected reads (#8108)\n\n* perf(javascript): index member-effect paths for projected reads\n\nEach projected read scanned every member-write record of its binding and\ntested the record path against the selection. On the #7774 reproducer\nonly 3.7% of scanned records pass that test. Index each binding's\nappend-only records by path in a lazily built trie that extends itself\nwith newly appended records, and visit only records whose exact keys a\nselected choice names or whose keys are wildcards. Candidates come back\nin record order and still pass the exact predicate, now owned next to\nthe index as semanticEffectPathMatches.\n\nThe semantic IR and the complete analyze-javascript-application Evidence\nare byte-identical. On the full reproducer each worker phase drops from\nabout 80 s to 29 s, and to 8 s together with #8103.\n\nRefs #7774\n\nCo-Authored-By: Claude Opus 5.5 \n\n* perf(javascript): stop escape checks at the first indexed match\n\nThe escape check only asks whether any matching escape is unsuperseded,\nso it does not need ordered candidates. Share one trie traversal between\nthe ordered write candidates and an early-exit visitor for this check.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["6bb831df60d57c48fecaf11ce26efbe64861b7b2"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8108] + }, + { + "sha": "b1ff7cdacc03110d51bcac33da3cbb7850ac27fc", + "subject": "fix(hopper): distinguish an absent demo dialog from publisher rejection (#8074)", + "body": "fix(hopper): distinguish an absent demo dialog from publisher rejection (#8074)\n\n* fix(hopper): distinguish an absent demo dialog from publisher rejection\n\nThe Linux demo watcher collapsed an admitted launcher with no first-run dialog into unsupported_demo_dialog. Report that post-authentication timeout as demo_dialog_absent, keep the unsupported dialog code for an observed but unrecognized Hopper window, and allow REA_HOPPER_DEMO_DIALOG_TIMEOUT_MS to widen the fixed wait. Closes #8008.\n\n* fix(hopper): tolerate callers without the dialog timeout argument\n\n* fix(hopper): report an invalid demo dialog timeout as its own failure\n\nAn invalid REA_HOPPER_DEMO_DIALOG_TIMEOUT_MS exited 73 and was shown as\ninvalid_launch_command. Exit 82 is invalid_dialog_timeout. The public error\nnames the setting, shows the rejected value and source, lists the allowed\nrange, and says to restart REA.\n\nDrive the demo watcher with controlled windows and time. No window exits 81,\na Hopper window without a supported dialog exits 76, and a dialog that arrives\nafter the old 10 second limit is still accepted.\n\n* fix(hopper): keep startup stderr capture on AdapterFailure\n\nDemoWatchStop was inserted above with_stderr, so launch failures called a\nmethod they no longer had and became unexpected_failure. Restore with_stderr\non AdapterFailure and reject a watcher fixture that cannot capture stderr.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["767f6afc18f19687eef663a10e9a3983f6f9979e"], + "authors": [ + { + "name": "Henglie", + "email": "90338155+Henglie@users.noreply.github.com", + "user": { + "login": "Henglie", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8074] + }, + { + "sha": "77b09314ffcb36a96eecc2b139f37a2ebe184f5f", + "subject": "test(ci): require provider checks and reduce test startup (#8145)", + "body": "test(ci): require provider checks and reduce test startup (#8145)\n\n* test(ci): require provider coverage and reuse test sessions\n\n* fix(ci): prepare the runtime before Python producer tests\n\nThe fast Python job ran the suite on a fresh checkout, so analysis-efficiency\nchecks failed without compiled process modules. Install locked dependencies\nand prepare the runtime before the suite.\n\n* fix(ci): keep provider test reports inside the checkout\n\nThe provider-report reader accepted an arbitrary path from argv. Resolve the\npath and reject anything outside the checkout before reading it. The packet\nand signal workflows write those reports under .cache.\n\n* fix(ci): require a test module in each named Python bridge family\n\nDiscovery still runs every bridge test. The mitmproxy, native, and pwndbg\nfamilies must each keep a test module, so deleting one cannot pass through\nthe others.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["b1ff7cdacc03110d51bcac33da3cbb7850ac27fc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8145] + }, + { + "sha": "8f920bb65b8d8ae669411501b0a3a59a62883ac3", + "subject": "fix(javascript): emit no http request for a target that is not a URL (#8147)", + "body": "fix(javascript): emit no http request for a target that is not a URL (#8147)\n\n* fix(javascript): emit no http request for a target that is not a URL\n\n`node:http` parses a string target with `new URL(...)` before a request object\nexists, so a literal that is not an absolute URL throws `ERR_INVALID_URL`\nsynchronously. The analysis reported `endpoint` at `resolution: \"complete\"` for\nthose calls, and the graph then projected `constructs-request` as `resolved`.\n\nMeasured on Node 24.22.1:\n\n http.get(\"nope\") -> THREW ERR_INVALID_URL\n http.get(\"example.test/api\") -> THREW ERR_INVALID_URL\n http.get(\"/api/items\") -> THREW ERR_INVALID_URL\n http.get(\"/api/items\", { host }) -> THREW ERR_INVALID_URL\n http.get(\"\") -> THREW ERR_INVALID_URL\n http.get(\"//example.test/x\") -> THREW ERR_INVALID_URL\n http.get(\"http://\") -> THREW ERR_INVALID_URL\n http.request(\"nope\") -> THREW ERR_INVALID_URL\n https.get(\"/api/items\") -> THREW ERR_INVALID_URL\n --- accepted ---\n http.get(\"http://example.test/x\") -> OK ClientRequest\n http.get(\"HTTP://example.test/x\") -> OK ClientRequest\n http.get(\"http:/x\") -> OK ClientRequest\n http.get(\"http:///x\") -> OK ClientRequest\n http.get(\"http:x\") -> OK ClientRequest\n\n`URL.canParse` is the exact predictor of that branch, so a relative spelling such\nas `\"http:x\"` keeps its operation. It already has precedent in this codebase\n(`javascriptPackageImportAliases.ts`).\n\nTwo boundaries are deliberate. `fetch` and `new WebSocket` are host-supplied\nglobals: a browser resolves a relative target against the document URL, so their\nspellings are not judged by Node's absolute-URL rule. A protocol mismatch such as\n`http.get(\"ftp://...\")` is also left alone because an options object can rescue\nit, so it is not a provable throw.\n\nThe guard is scoped to `method === \"get\" | \"request\"`, which only\n`requestMethod`'s `http`/`https` builtin branch can produce.\n\n* chore: retrigger title and readiness checks after the title was corrected", + "parents": ["77b09314ffcb36a96eecc2b139f37a2ebe184f5f"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8147] + }, + { + "sha": "cd878ad57d3e27e835d0db533c9603b24ae8607a", + "subject": "refactor(ci): unify lane ownership and guard Python tests (#8150)", + "body": "refactor(ci): unify lane ownership and guard Python tests (#8150)\n\n* refactor(ci): unify lane ownership and guard Python tests\n\n* fix(ci): reject entirely skipped bridge subtests", + "parents": ["8f920bb65b8d8ae669411501b0a3a59a62883ac3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8150] + }, + { + "sha": "b33f4a5a1bf5542c38ae07eef4244289dac7f186", + "subject": "docs: correct the raw ARM example and document a Cortex-M language override (#7483)", + "body": "docs: correct the raw ARM example and document a Cortex-M language override (#7483)\n\n* docs(raw-binary): replace the STM32-style ARM example\n\nThe headline raw example opened ecu.bin at 0x8000000, an STM32 flash\naddress, while the arm lane decodes in ARM state. Map a 32-bit ARM-state\nimage at 0x8000 instead, and state beside the example that Thumb-only\nimages, including Cortex-M firmware, are not supported.\n\n* docs(ghidra): document an interim Cortex-M language override\n\nGhidra imports little-endian ARM ELF files as ARM:LE:32:v8, which\ndefaults to ARM state and marks Thumb code only from $t mapping symbols\nand odd function-symbol addresses. Unpinned arm ELF already admits\nREA_GHIDRA_LANGUAGE_ID, so document ARM:LE:32:Cortex (ARMv6-M, ARMv7-M,\nARMv7E-M) and ARM:LE:32:v8-m (ARMv8-M) as an unverified interim.\n\nState the override's full effect while it is set: raw-binary, DOS, DOL,\nPSP and language-pinned lanes such as RISC-V refuse it, and REA asks\nGhidra to import every other target in the ARM language, because it does\nnot check the override's processor against the target.", + "parents": ["cd878ad57d3e27e835d0db533c9603b24ae8607a"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [7483] + }, + { + "sha": "1926fc2dace081987c0b70f2a79c1d87e606bcbd", + "subject": "fix(ida): admit architecture families by allowlist (#7485)", + "body": "fix(ida): admit architecture families by allowlist (#7485)\n\nIDA refused MIPS, RISC-V, PowerPC, Hexagon and arm64_32 by denylist, so\nany family nobody excluded was reported supported, and the label ternary\nprinted \"Hexagon\" for any other metadata family. Admit exactly the\nfamilies IDA admits today (x86, x86_64, arm, arm64) and name every other\nfamily from its own architecture id. Families that Ghidra admits keep\nthe pointer to a Ghidra profile.\n\nRefusal text now uses architecture ids, for example \"no verified mips\nlane\" instead of \"no verified MIPS lane\".", + "parents": ["b33f4a5a1bf5542c38ae07eef4244289dac7f186"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [7485] + }, + { + "sha": "19ab2392781b923a2056ed6c7317e1b4e19c1066", + "subject": "ci(ghidra): probe M-profile ARM and Xtensa decoding (#7482)", + "body": "ci(ghidra): probe M-profile ARM and Xtensa decoding (#7482)\n\n* ci(ghidra): probe M-profile ARM and Xtensa decoding\n\nThe embedded plan relies on ARM:LE:32:Cortex, ARM:LE:32:v8-m and\nXtensa:LE:32:default, but CI only exercised ARM:LE:32:v7. Import\nsource-owned bytes for each language at 0x1000 with -noanalysis and\ncheck how they decode from the language's default context: Cortex and\nv8-m must start in Thumb state, v8-m must decode the ARMv8-M MSPLIM\nregister, and Xtensa must decode entry and retw.n.\n\nAdd the probe scripts the job runs, including the existing ARM context\nprobe, to the ghidra_bridge change scope.\n\n* ci(ghidra): match decode-probe operands as complete operands\n\nThe operand expectation searched the instruction text for a substring,\nso mrs/4/msp also accepted mrs r0,msplim. Compare it with each operand\nGhidra reports for the instruction, so only a complete operand matches.\nThe Cortex (msp, lr), v8-M (msplim, lr) and Xtensa (a1) expectations are\nunchanged.", + "parents": ["1926fc2dace081987c0b70f2a79c1d87e606bcbd"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [7482] + }, + { + "sha": "54756ff24e1f4c2e47554f61ea5efe57bab27b64", + "subject": "test: guard target format vocabularies and DOL snapshot saves (#7481)", + "body": "test: guard target format vocabularies and DOL snapshot saves (#7481)\n\n* test(mcp): save and reopen a GameCube DOL snapshot\n\n#7290 reported that DOL Evidence could not be bundled or saved; 50822e1ef\nfixed the bundle manifest and added bundle export/import coverage, but no\ntest saved a DOL session through close_binary. Save a DOL snapshot with\nrecorded Evidence, check its target and artifact manifest, then reopen it\nand replay the read without running the provider again.\n\n* test(binary): require every target format in each target vocabulary\n\nA new target format must be added by hand to the Evidence subject,\nbundle manifest, snapshot target and live summary vocabularies; missing\none caused #7290. Give every BinaryTarget format a fixture through a\nmapped type, so a new format fails compilation until it has one, and\npush each fixture through the producers that persist or project targets.\nCaller-selected format hints must name executable target formats.\n\nThis is a guard until target formats have a single owner.\n\n* test(mcp): assert the replayed DOL result and the owned replay limitation\n\nThe DOL snapshot replay test checked the subject and the provider-call\ncount but not the answer, so a replay returning null or another value\nwould pass. Compare the replayed normalized result with the original.\nName the replay limitation as SNAPSHOT_REPLAY_LIMITATION in the snapshot\ncache that adds it, and assert that value instead of repeating the\nsentence.\n\n* test: list Intel HEX and S-record targets in the vocabulary guard\n\nUpstream added the intel-hex and srec formats (#7136). The guard requires\na fixture for every target format, so after merging main it no longer\ntypechecked; both formats now have archive fixtures and pass the same\npersistence and projection checks.\n\n* test: list UnityFS among the target format fixtures\n\nUpstream #7699 added the unityfs target format, so the vocabulary test's\nper-format fixtures must name it; without one the test no longer typechecks\nagainst main.\n\n* test: list uImage among the target format fixtures\n\nUpstream #7234 added the uimage target format, so the vocabulary test's\nper-format fixtures must name it; without one the test no longer typechecks\nagainst main.\n\n* test: list the ESP image among the target format fixtures\n\nUpstream #7498 added the esp-image target format, so the vocabulary test's\nper-format fixtures must name it; without one the test no longer typechecks\nagainst main.", + "parents": ["19ab2392781b923a2056ed6c7317e1b4e19c1066"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [7481] + }, + { + "sha": "250dc81cd6b887f41a4078b65ca7a78628d1c541", + "subject": "fix: correct stale provider refusal and diagnostic text (#7484)", + "body": "fix: correct stale provider refusal and diagnostic text (#7484)\n\n* fix(ghidra): name every admitted family in the architecture refusal\n\nThe refusal listed x86, x86_64, arm, arm64, MIPS, RISC-V, raw 6502 and\nraw m68k, but the admission set also holds powerpc and hexagon. Build\nthe text from SUPPORTED_ARCHITECTURES, marking raw-only families, so a\nnewly admitted family cannot be left out again, and name the refused\nfamily.\n\n* fix(hopper): stop calling the Ghidra Hexagon lane verified\n\nHopper declined Hexagon targets with \"Select a verified Ghidra Hexagon\nprofile instead\", but REA has no verified Hexagon lane. Record whether\neach declined family's Ghidra lane is verified, and say that Ghidra\nadmits Hexagon through an unverified lane.\n\nName declined families by architecture id, as the Ghidra and IDA\nrefusals do.\n\n* fix(ghidra): name the pinned language in profile readback refusals\n\nThe session readback said \"MIPS\" whenever a provider-pinned profile\nconflicted with the target or with REA_GHIDRA_LANGUAGE_ID, although the\nRISC-V, PowerPC and DOL lanes are pinned too. The readback helper was\nMIPS-named and re-parsed the language slot that\nghidraProfileLanguageOverride already owns. Move it beside that owner as\na family-neutral readback and name the pinned language id instead.\n\n* fix(ghidra): list DOL among independently verified load images\n\nGameCube DOL load images are independently verified, but the declined\nformat reason, the inspect_native_load_image capability note and the\nWindows P0 guide listed only DOS MZ, DOS COM and raw-binary.\n\n* fix(ghidra): count RV32E's sixteen integer registers\n\nThe EF_RISCV_RVE refusal described a 15-register ABI. RV32E has 16\ninteger registers, x0-x15, as docs/ghidra-riscv.md already says.\n\n* fix(elf): name the refused e_machine\n\n\"unsupported ELF architecture\" did not say which machine was refused.\nInclude the numeric e_machine, for example EM_XTENSA 94.\n\n* test(hopper): assert declined-lane facts and owned refusal reasons\n\nThe MIPS case banned the phrase \"not verified\" instead of checking\nfacts, so wrong advice would still pass. Expose each declined family's\nGhidra lane status, assert those statuses, check that the advice depends\non the status, and compare Hopper's refusals with\nhopperDeclinedArchitectureReason. The RISC-V refusal table now compares\nthe provider's reason with ghidraRiscvUnsupportedReason and expects the\nEF_RISCV_RVE declaration name rather than fixed wording.\n\n* test(ghidra): assert verified load-image formats as owned facts\n\nThe declined-format test required display phrases such as \"DOS MZ\" and\n\"GameCube DOL\", so harmless rewording failed it while wrong guidance\ncontaining those names passed. The format list was also spelled three\ntimes: in the attestation's membership check, its reason and the\ninspect_native_load_image capability note. Give the verified formats one\nowner with the formatters for both texts, assert the list as a fact, and\ncompare the delivered reason and capability note with those formatters.\n\n* fix(hopper): stop restating which Ghidra lanes REA has verified\n\nHopper's refusal for families it declines carried its own table of\nwhich Ghidra lanes REA has verified (mips, riscv and powerpc verified,\nhexagon not). That restated the Ghidra provider's facts in Hopper and\ngoes stale whenever they change, the drift that made the Hexagon refusal\nwrong in the first place. Reading Ghidra's facts from Hopper would\ncouple the providers instead; no module in src/hopper imports from\nsrc/ghidra.\n\nThe table and hopperDeclinedGhidraLane are removed.\nhopperDeclinedArchitectureReason now states only what Hopper owns: it\ndoes not admit the family, and the Ghidra provider's lane reports\nwhether REA has verified it. The arm64_32 sentence is unchanged.\n\nThe test checks every declined family against the formatter: each\nreason names the family and Ghidra, and apart from the name all reasons\nare the same text, so none states a per-family Ghidra status.\n\n* fix(hopper): route declined families to Ghidra without promising its lane facts\n\nThe refusal said the Ghidra lane reports whether REA has verified it, but\nGhidra admits Hexagon with no such note, so a caller could not find the\npromised status. Hopper now only states that it does not admit the family\nand routes the caller to the Ghidra provider.", + "parents": ["54756ff24e1f4c2e47554f61ea5efe57bab27b64"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [7484] + }, + { + "sha": "1ddee1089b2300dc8220ade654cc73cd74d46a74", + "subject": "feat(dotnet): expose field constant defaults (#8015)", + "body": "feat(dotnet): expose field constant defaults (#8015)\n\n* feat(dotnet): expose field constant defaults\n\n* test(dotnet): guard field default comparison warning\n\nCompare actual ordinary and constant-bearing observations independently of the limitation producer. Preserve warning delivery and unchanged matching assertions while allowing harmless wording changes.\n\nRefs #5150\n\n* test(mcp): retain structured bundle path diagnostics\n\nKeep absolute-path refusal and all rejected parameter facts independent of legacy flat or current structured SDK diagnostic rendering. Retain relative CLI, absolute MCP and no-Evidence controls.\n\nRefs #5150\n\n* Revert \"fix(ci): integrate main and repair inherited static checks\"\n\nThis reverts commit afd4d571f69b9d4e2dbc0e92dc2a39abf4a3b83f, reversing\nchanges made to 317bf3fe235e655b2d752d3be261cc0da7d00f2b.\n\n* fix(ci): replay reviewed field-default integration\n\n* fix(analysis-view): keep inferred confidence on views of inferred Evidence (#8099)\n\ncreateAnalysisViewEvidence chose view confidence from the view result kind\nonly, so every summary, page or item view of an inferred parent\n(compare_source_to_bundle, inspect_evm_interface, partially resolved\ninspect_il2cpp_metadata) was sealed as derived while keeping the parent's\nauthority. A projection never makes its facts more certain: an inferred\nparent now yields inferred views through CLI and MCP alike. Observed and\nderived parents keep their existing view confidence and identities.\n\nFixes #8098\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(apple): read flattened framework Info.plist from Resources (#8101)\n\nA macOS framework without Versions/ keeps its binary, _CodeSignature/ and\nResources/Info.plist directly in the .framework, as Electron and Gecko apps\nship it. Bundle anatomy looked for a shallow bundle's plist only at its root\nand reported info_plist_path: null under complete coverage.\n\nResolve a shallow bundle's root Info.plist first, then Resources/Info.plist,\nthe same layout a framework version directory uses. Keep the iOS platform\nrule tied to a root-level Info.plist so a Resources/-only application root\nis not classified as iOS.\n\nFixes #8100\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(desktop): charge retained rows at their measured representation (#8105)\n\n* fix(desktop): charge retained rows at their measured representation\n\nThe desktop scan reserved 1024 + 24 bytes per path character for every\nrow, omission and the root against its 32 MiB representation budget. Real\nrows cost 800-940 heap and 490-640 JSON bytes, so the charge overstated\nthem 6-13 times and large macOS bundles stopped at 3,700-7,200 entries,\nfar below max_entries.\n\nCharge each path at the larger of its UTF-16 heap size and its escaped\nJSON size, plus the existing fixed row and omission overheads, in one\nhelper. The bound still covers the retained heap and the serialized\nreport, including control-character paths that expand six times in JSON.\n\nFixes #8104\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(desktop): charge every retained copy of a path\n\nThe tighter row charge counted each path once, but rows repeat it in\nconvention-fact values and the next probes those facts offer, and host\nfailure issues name the absolute path. Control-character paths under a\nconvention such as Content/Paks or resources/app.asar therefore serialized\n47-80 MiB of reports within the 32 MiB budget.\n\nReserve each copy through the same text helper where it is stored: path\nconvention facts with their row, the probes any fact offers (at most two,\npinned by a projection test) with that fact, retained read ranges before\ntheir read, and probe failure issues before they are recorded.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(source-maps): resolve empty sourceRoot sources against the map URL (#8107)\n\nwebpack 5 and tsc write \"sourceRoot\": \"\" for map-relative sources. Since\n5f702dd6c the shared join added \"/\" for any non-null root, so these\nsources resolved from the URL root: rxjs's ../../../src/internal/Observable.ts\nunder /npm/rxjs@7.8.1/dist/cjs/internal/ became /src/internal/Observable.ts,\nand xterm's webpack://xterm/./src/... became https://host/webpack://xterm/....\n\nTreat an empty root like a null root in sourceMapReference, the single join\nused by trace-web-source-location, analyze-javascript-application and the\nweb source-map fetcher. Chrome, Firefox and trace-mapping skip an empty root,\nand tc39/ecma426#183 wrote the current steps to match them. Non-empty roots,\nincluding \"/\" and repeated slashes (#6726), keep their existing behavior.\n\nFixes #8106\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(javascript): stop reporting self-defaulted receivers as module loads (#8109)\n\nThe CommonJS loader search treated any repeated state on its own ancestor\nchain as an unknown loader. A self-default such as\n`session.messages = session.messages || []` forms that cycle, because a\nmember read inside the assigned value was attributed to the later call's\nread site and selected the same write again. Each `push` on the value was\nthen reported as an unresolved `require` load, and graph coverage became\npartial.\n\nRecord a member read inside a flowed value as a depth-1 captured selection\nat its own position, as member mutations already do for flowed origins.\nTreat a revisited state as adding no source; the cycle's other entries are\nstill expanded once each. Remove the superseded ancestor tracking.\n\nFixes #8102\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(captures): admit browser-serialized HAR request URLs (#8112)\n\n* fix(captures): admit browser-serialized HAR request URLs\n\nhar-schema@2.0.0 checks request.url with ajv-formats' strict RFC 3986\n`uri` format. Browsers record and send URLs as WHATWG serializes them,\nwhich keeps characters such as `|` and `{` unescaped in the query, so one\nGoogle Fonts or GraphQL GET entry made inspect-web-network-capture and\nenvironment-build reject the whole HAR.\n\nHAR 1.2 defines request.url only as the absolute request URL. Own that\ncorrection in the HAR validator: every URL the RFC 3986 check accepts\nstays accepted, and a URL that WHATWG URL serialization reproduces\nunchanged is accepted too. Spellings WHATWG would rewrite (a backslash\nauthority, a tab, a space) and relative references still fail.\n\nFixes #8110\n\nCo-Authored-By: Claude Opus 5.5 \n\n* docs(captures): state that RFC 3986 request URLs stay admitted\n\nThe HAR request URL rule is \"passes RFC 3986, or WHATWG serialization\nreproduces it unchanged\". A spelling WHATWG would rewrite therefore fails\nonly when it also fails the RFC 3986 check; an uppercase host still\npasses. Say so in the docs and the validator comment, and pin the\naccepted uppercase-host case in the CLI test.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(apple): charge the XML plist decoder's DOM before decoding (#8115)\n\n* fix(apple): charge the XML plist decoder's DOM before decoding\n\nThe XML preflight charged 4 bytes per character and 256 bytes per start\nor end tag. The decoder builds an @xmldom/xmldom DOM that measured\n1,000-1,160 bytes per element and up to 240 bytes per text, comment or\nCDATA node, which were not charged at all. A 1.75 MB plist of 230,000\n lines was admitted under the 64 MiB decode budget and peaked at\n249 MiB of heap; shipped Apple plists peaked at 80-104 MiB.\n\nCharge each element and each text, comment, CDATA or DOCTYPE node at a\nmeasured upper bound, keeping the character and number-projection terms.\nThe binary estimator already bounds its decoder and is unchanged.\n\nFixes #8113\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(apple): charge every XML element, attribute and reference\n\nThe XML preflight recognized only element names starting with an ASCII\nletter, so names such as é, _, a CJK or astral character escaped the\nelement charge: 100,000 <é/> elements (0.5 MB) built an 84 MiB DOM before\nthe plist decoder rejected the tag. Attributes and entity or character\nreferences were also uncharged; 20 attributes per element measured about\n210 bytes each, and each reference about 26 bytes beyond its characters.\n\nClassify markup by the character after \"<\" instead of a name pattern, so\nanything other than an end tag, comment, CDATA, PI or declaration counts as\nan element (saxes rejects malformed markup before the DOM is built). Charge\neach unquoted \"=\" in a start tag as an attribute node and every \"&\" as a\nreference.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(apple): charge XML references only where the parser expands them\n\nThe previous commit charged every \"&\" in the document as a reference,\nincluding literal ampersands inside CDATA sections and comments. A valid\nplist with one CDATA string of 1,000,000 ampersands was refused although\nit is a single node the decoder holds as one string.\n\nCount \"&\" during the existing token walk, only in text runs and in the\nattribute values of start tags, so comments, CDATA, PIs and declarations\nadd no reference charge and the scan stays a single pass.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(fit): preserve leading U+FEFF in property strings (#8083)\n\n* fix(environment): retain conflicting scenario MIME uncertainty (#8082)\n\n* fix(environment): retain conflicting scenario MIME uncertainty\n\n* test(mcp): assert structured absolute-path diagnostics\n\n* test(mcp): assert typed selector and stdio diagnostics\n\n* fix(electron): keep literal IPC sends ambiguous beside unresolved handlers (#8120)\n\n* fix(electron): keep literal IPC sends ambiguous beside unresolved handlers\n\nA main handler on an unresolved channel can receive any literal renderer\nsend of a compatible mode, but pairing ignored it unless it had a scoped\nreceiver. The send was then reported unpaired, or paired with another\nhandler. Treat an unresolved-channel handler as a competitor that never\npairs.\n\nThe wrapper pass seeds only calls with a literal first argument, so it now\nrecords which invocations of a dynamic site it traced. The syntax finding\ngains `invocation_channels: \"literal\"` only when every invocation is a\ntraced direct call of an unexported local function supplying a literal\nchannel. Such a site is already represented by its per-invocation findings\nand does not compete.\n\nFixes #8118\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(electron): keep guarded wrapper registrations competing in IPC pairing\n\nA guarded wrapper registration keeps its predicate on a call path and has\nno IPC finding. It still counted toward `invocation_channels: \"literal\"`,\nso pairing lost it: a send on that channel was reported unpaired, or\npaired uniquely with a direct handler. The enumerated site now carries\nthese channels as `guarded_invocation_channels`, and each one competes for\nits own channel without pairing.\n\nIndex each binding's direct call sites by appending in place. Spreading\nthe earlier calls on every reference was quadratic in a file's call count.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(ci): remove unused exports that fail deep static checks (#8095)\n\n* fix(ci): remove unused exports that fail deep static checks\n\nKnip on main reports three analysis-view hub re-exports, two type\nre-exports, an unused artifact-format guard and an alias constant. Drop\nthe dead re-exports and guard, and give the debugger control-reply budget\nits own literal: it is a separate budget from the caller command-output\ndefault, as its comment already states.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(config): read the Rizin control budget from its own constant\n\nThe Rizin control-reply admission limit still took its value from the\ncaller command-output default, while GDB used DEBUGGER_CONTROL_REPLY_BYTES.\nRead the dedicated constant in both so the control budget has one owner.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \n\n* perf(javascript): keep one member-effect record per stored fact (#8103)\n\nMember-mutation indexing appended a binding write or escape record for\nevery traversal state that reached it. States that differ only in\ncoverage fields the record never stores (origin, owner initializer,\ngetter widening) produced identical records, and each later receiver\nquery rescanned all of them. Record each stored fact once, alongside the\nexisting required-module effect deduplication. Propagation is unchanged.\n\nEffect ordering also re-walked the same top-level statement ancestry for\nevery candidate record. Cache it with the other initializer positions,\nand test the selected path before the costlier receiver comparison.\n\nOn the #7774 reproducer the semantic IR and the complete\nanalyze-javascript-application Evidence are byte-identical, while the\nCLI run drops from 146 s to 40 s.\n\nRefs #7774\n\nCo-authored-by: Claude Opus 5.5 \n\n* feat(native): open extension, framework, XPC and plug-in bundle directories (#8117)\n\n* feat(native): open extension, framework, XPC and plug-in bundle directories\n\nopen_binary and the CLI inspection commands admitted only .app\ndirectories and pointed every other Apple bundle at the JavaScript\nanalyzer. Resolve .appex, .framework, .xpc, .systemextension, .bundle\nand .plugin directories through their Info.plist CFBundleExecutable, in\nthe Contents or flat root layout, plus the versioned framework layout\nunder Versions/Current. Exactly one layout may declare the bundle and\nevery resolved path must stay inside it.\n\nUnresolvable bundles fail closed with typed constraints, probed paths\nand the Info.plist that was read. Other Apple bundle types are refused as\nunsupported instead of being offered the JavaScript route. Resource-root\ndiscovery shares the same layout rule, so inspect_plist reads a\nversioned framework's Info.plist. The recognized bundle vocabulary now\nhas one owner in the domain.\n\nRefs #4310\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): refuse kernel extensions and state bundle error fields\n\nName the Apple bundle types binary routes recognize but do not open\n(.dext, .kext, .qlgenerator, .mdimporter) explicitly, so a kernel\nextension is refused as unsupported instead of receiving the JavaScript\nroute. Document which bundle refusals carry probed_paths and info_plist,\nand make success tests throw the typed admission error before asserting.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(native): open flattened frameworks through Resources/Info.plist\n\nElectron and Gecko apps ship frameworks without Versions/: the program\nfile sits at the framework root beside Resources/Info.plist, the layout\n#8101 taught bundle anatomy. Read that layout for a framework without\nVersions/, and keep the versioned layout for one with it, so a versioned\nframework's root Resources link is never read as a second declaration.\nThe resource root reports it as flattened-framework.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \n\n* chore(security): configure dependency and ownership reviews\n\n* perf(javascript): index member-effect paths for projected reads (#8108)\n\n* perf(javascript): index member-effect paths for projected reads\n\nEach projected read scanned every member-write record of its binding and\ntested the record path against the selection. On the #7774 reproducer\nonly 3.7% of scanned records pass that test. Index each binding's\nappend-only records by path in a lazily built trie that extends itself\nwith newly appended records, and visit only records whose exact keys a\nselected choice names or whose keys are wildcards. Candidates come back\nin record order and still pass the exact predicate, now owned next to\nthe index as semanticEffectPathMatches.\n\nThe semantic IR and the complete analyze-javascript-application Evidence\nare byte-identical. On the full reproducer each worker phase drops from\nabout 80 s to 29 s, and to 8 s together with #8103.\n\nRefs #7774\n\nCo-Authored-By: Claude Opus 5.5 \n\n* perf(javascript): stop escape checks at the first indexed match\n\nThe escape check only asks whether any matching escape is unsuperseded,\nso it does not need ordered candidates. Share one trie traversal between\nthe ordered write candidates and an early-exit visitor for this check.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \n\n* fix(hopper): distinguish an absent demo dialog from publisher rejection (#8074)\n\n* fix(hopper): distinguish an absent demo dialog from publisher rejection\n\nThe Linux demo watcher collapsed an admitted launcher with no first-run dialog into unsupported_demo_dialog. Report that post-authentication timeout as demo_dialog_absent, keep the unsupported dialog code for an observed but unrecognized Hopper window, and allow REA_HOPPER_DEMO_DIALOG_TIMEOUT_MS to widen the fixed wait. Closes #8008.\n\n* fix(hopper): tolerate callers without the dialog timeout argument\n\n* fix(hopper): report an invalid demo dialog timeout as its own failure\n\nAn invalid REA_HOPPER_DEMO_DIALOG_TIMEOUT_MS exited 73 and was shown as\ninvalid_launch_command. Exit 82 is invalid_dialog_timeout. The public error\nnames the setting, shows the rejected value and source, lists the allowed\nrange, and says to restart REA.\n\nDrive the demo watcher with controlled windows and time. No window exits 81,\na Hopper window without a supported dialog exits 76, and a dialog that arrives\nafter the old 10 second limit is still accepted.\n\n* fix(hopper): keep startup stderr capture on AdapterFailure\n\nDemoWatchStop was inserted above with_stderr, so launch failures called a\nmethod they no longer had and became unexpected_failure. Restore with_stderr\non AdapterFailure and reject a watcher fixture that cannot capture stderr.\n\n---------\n\nCo-authored-by: Cursor Agent \n\n* test(ci): require provider checks and reduce test startup (#8145)\n\n* test(ci): require provider coverage and reuse test sessions\n\n* fix(ci): prepare the runtime before Python producer tests\n\nThe fast Python job ran the suite on a fresh checkout, so analysis-efficiency\nchecks failed without compiled process modules. Install locked dependencies\nand prepare the runtime before the suite.\n\n* fix(ci): keep provider test reports inside the checkout\n\nThe provider-report reader accepted an arbitrary path from argv. Resolve the\npath and reject anything outside the checkout before reading it. The packet\nand signal workflows write those reports under .cache.\n\n* fix(ci): require a test module in each named Python bridge family\n\nDiscovery still runs every bridge test. The mitmproxy, native, and pwndbg\nfamilies must each keep a test module, so deleting one cannot pass through\nthe others.\n\n---------\n\nCo-authored-by: Cursor Agent \n\n* fix(javascript): emit no http request for a target that is not a URL (#8147)\n\n* fix(javascript): emit no http request for a target that is not a URL\n\n`node:http` parses a string target with `new URL(...)` before a request object\nexists, so a literal that is not an absolute URL throws `ERR_INVALID_URL`\nsynchronously. The analysis reported `endpoint` at `resolution: \"complete\"` for\nthose calls, and the graph then projected `constructs-request` as `resolved`.\n\nMeasured on Node 24.22.1:\n\n http.get(\"nope\") -> THREW ERR_INVALID_URL\n http.get(\"example.test/api\") -> THREW ERR_INVALID_URL\n http.get(\"/api/items\") -> THREW ERR_INVALID_URL\n http.get(\"/api/items\", { host }) -> THREW ERR_INVALID_URL\n http.get(\"\") -> THREW ERR_INVALID_URL\n http.get(\"//example.test/x\") -> THREW ERR_INVALID_URL\n http.get(\"http://\") -> THREW ERR_INVALID_URL\n http.request(\"nope\") -> THREW ERR_INVALID_URL\n https.get(\"/api/items\") -> THREW ERR_INVALID_URL\n --- accepted ---\n http.get(\"http://example.test/x\") -> OK ClientRequest\n http.get(\"HTTP://example.test/x\") -> OK ClientRequest\n http.get(\"http:/x\") -> OK ClientRequest\n http.get(\"http:///x\") -> OK ClientRequest\n http.get(\"http:x\") -> OK ClientRequest\n\n`URL.canParse` is the exact predictor of that branch, so a relative spelling such\nas `\"http:x\"` keeps its operation. It already has precedent in this codebase\n(`javascriptPackageImportAliases.ts`).\n\nTwo boundaries are deliberate. `fetch` and `new WebSocket` are host-supplied\nglobals: a browser resolves a relative target against the document URL, so their\nspellings are not judged by Node's absolute-URL rule. A protocol mismatch such as\n`http.get(\"ftp://...\")` is also left alone because an options object can rescue\nit, so it is not a provable throw.\n\nThe guard is scoped to `method === \"get\" | \"request\"`, which only\n`requestMethod`'s `http`/`https` builtin branch can produce.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* refactor(ci): unify lane ownership and guard Python tests (#8150)\n\n* refactor(ci): unify lane ownership and guard Python tests\n\n* fix(ci): reject entirely skipped bridge subtests\n\n* docs: correct the raw ARM example and document a Cortex-M language override (#7483)\n\n* docs(raw-binary): replace the STM32-style ARM example\n\nThe headline raw example opened ecu.bin at 0x8000000, an STM32 flash\naddress, while the arm lane decodes in ARM state. Map a 32-bit ARM-state\nimage at 0x8000 instead, and state beside the example that Thumb-only\nimages, including Cortex-M firmware, are not supported.\n\n* docs(ghidra): document an interim Cortex-M language override\n\nGhidra imports little-endian ARM ELF files as ARM:LE:32:v8, which\ndefaults to ARM state and marks Thumb code only from $t mapping symbols\nand odd function-symbol addresses. Unpinned arm ELF already admits\nREA_GHIDRA_LANGUAGE_ID, so document ARM:LE:32:Cortex (ARMv6-M, ARMv7-M,\nARMv7E-M) and ARM:LE:32:v8-m (ARMv8-M) as an unverified interim.\n\nState the override's full effect while it is set: raw-binary, DOS, DOL,\nPSP and language-pinned lanes such as RISC-V refuse it, and REA asks\nGhidra to import every other target in the ARM language, because it does\nnot check the override's processor against the target.\n\n* fix(ida): admit architecture families by allowlist (#7485)\n\nIDA refused MIPS, RISC-V, PowerPC, Hexagon and arm64_32 by denylist, so\nany family nobody excluded was reported supported, and the label ternary\nprinted \"Hexagon\" for any other metadata family. Admit exactly the\nfamilies IDA admits today (x86, x86_64, arm, arm64) and name every other\nfamily from its own architecture id. Families that Ghidra admits keep\nthe pointer to a Ghidra profile.\n\nRefusal text now uses architecture ids, for example \"no verified mips\nlane\" instead of \"no verified MIPS lane\".\n\n* ci(ghidra): probe M-profile ARM and Xtensa decoding (#7482)\n\n* ci(ghidra): probe M-profile ARM and Xtensa decoding\n\nThe embedded plan relies on ARM:LE:32:Cortex, ARM:LE:32:v8-m and\nXtensa:LE:32:default, but CI only exercised ARM:LE:32:v7. Import\nsource-owned bytes for each language at 0x1000 with -noanalysis and\ncheck how they decode from the language's default context: Cortex and\nv8-m must start in Thumb state, v8-m must decode the ARMv8-M MSPLIM\nregister, and Xtensa must decode entry and retw.n.\n\nAdd the probe scripts the job runs, including the existing ARM context\nprobe, to the ghidra_bridge change scope.\n\n* ci(ghidra): match decode-probe operands as complete operands\n\nThe operand expectation searched the instruction text for a substring,\nso mrs/4/msp also accepted mrs r0,msplim. Compare it with each operand\nGhidra reports for the instruction, so only a complete operand matches.\nThe Cortex (msp, lr), v8-M (msplim, lr) and Xtensa (a1) expectations are\nunchanged.\n\n* test: guard target format vocabularies and DOL snapshot saves (#7481)\n\n* test(mcp): save and reopen a GameCube DOL snapshot\n\n#7290 reported that DOL Evidence could not be bundled or saved; 50822e1ef\nfixed the bundle manifest and added bundle export/import coverage, but no\ntest saved a DOL session through close_binary. Save a DOL snapshot with\nrecorded Evidence, check its target and artifact manifest, then reopen it\nand replay the read without running the provider again.\n\n* test(binary): require every target format in each target vocabulary\n\nA new target format must be added by hand to the Evidence subject,\nbundle manifest, snapshot target and live summary vocabularies; missing\none caused #7290. Give every BinaryTarget format a fixture through a\nmapped type, so a new format fails compilation until it has one, and\npush each fixture through the producers that persist or project targets.\nCaller-selected format hints must name executable target formats.\n\nThis is a guard until target formats have a single owner.\n\n* test(mcp): assert the replayed DOL result and the owned replay limitation\n\nThe DOL snapshot replay test checked the subject and the provider-call\ncount but not the answer, so a replay returning null or another value\nwould pass. Compare the replayed normalized result with the original.\nName the replay limitation as SNAPSHOT_REPLAY_LIMITATION in the snapshot\ncache that adds it, and assert that value instead of repeating the\nsentence.\n\n* test: list Intel HEX and S-record targets in the vocabulary guard\n\nUpstream added the intel-hex and srec formats (#7136). The guard requires\na fixture for every target format, so after merging main it no longer\ntypechecked; both formats now have archive fixtures and pass the same\npersistence and projection checks.\n\n* test: list UnityFS among the target format fixtures\n\nUpstream #7699 added the unityfs target format, so the vocabulary test's\nper-format fixtures must name it; without one the test no longer typechecks\nagainst main.\n\n* test: list uImage among the target format fixtures\n\nUpstream #7234 added the uimage target format, so the vocabulary test's\nper-format fixtures must name it; without one the test no longer typechecks\nagainst main.\n\n* test: list the ESP image among the target format fixtures\n\nUpstream #7498 added the esp-image target format, so the vocabulary test's\nper-format fixtures must name it; without one the test no longer typechecks\nagainst main.\n\n* fix: correct stale provider refusal and diagnostic text (#7484)\n\n* fix(ghidra): name every admitted family in the architecture refusal\n\nThe refusal listed x86, x86_64, arm, arm64, MIPS, RISC-V, raw 6502 and\nraw m68k, but the admission set also holds powerpc and hexagon. Build\nthe text from SUPPORTED_ARCHITECTURES, marking raw-only families, so a\nnewly admitted family cannot be left out again, and name the refused\nfamily.\n\n* fix(hopper): stop calling the Ghidra Hexagon lane verified\n\nHopper declined Hexagon targets with \"Select a verified Ghidra Hexagon\nprofile instead\", but REA has no verified Hexagon lane. Record whether\neach declined family's Ghidra lane is verified, and say that Ghidra\nadmits Hexagon through an unverified lane.\n\nName declined families by architecture id, as the Ghidra and IDA\nrefusals do.\n\n* fix(ghidra): name the pinned language in profile readback refusals\n\nThe session readback said \"MIPS\" whenever a provider-pinned profile\nconflicted with the target or with REA_GHIDRA_LANGUAGE_ID, although the\nRISC-V, PowerPC and DOL lanes are pinned too. The readback helper was\nMIPS-named and re-parsed the language slot that\nghidraProfileLanguageOverride already owns. Move it beside that owner as\na family-neutral readback and name the pinned language id instead.\n\n* fix(ghidra): list DOL among independently verified load images\n\nGameCube DOL load images are independently verified, but the declined\nformat reason, the inspect_native_load_image capability note and the\nWindows P0 guide listed only DOS MZ, DOS COM and raw-binary.\n\n* fix(ghidra): count RV32E's sixteen integer registers\n\nThe EF_RISCV_RVE refusal described a 15-register ABI. RV32E has 16\ninteger registers, x0-x15, as docs/ghidra-riscv.md already says.\n\n* fix(elf): name the refused e_machine\n\n\"unsupported ELF architecture\" did not say which machine was refused.\nInclude the numeric e_machine, for example EM_XTENSA 94.\n\n* test(hopper): assert declined-lane facts and owned refusal reasons\n\nThe MIPS case banned the phrase \"not verified\" instead of checking\nfacts, so wrong advice would still pass. Expose each declined family's\nGhidra lane status, assert those statuses, check that the advice depends\non the status, and compare Hopper's refusals with\nhopperDeclinedArchitectureReason. The RISC-V refusal table now compares\nthe provider's reason with ghidraRiscvUnsupportedReason and expects the\nEF_RISCV_RVE declaration name rather than fixed wording.\n\n* test(ghidra): assert verified load-image formats as owned facts\n\nThe declined-format test required display phrases such as \"DOS MZ\" and\n\"GameCube DOL\", so harmless rewording failed it while wrong guidance\ncontaining those names passed. The format list was also spelled three\ntimes: in the attestation's membership check, its reason and the\ninspect_native_load_image capability note. Give the verified formats one\nowner with the formatters for both texts, assert the list as a fact, and\ncompare the delivered reason and capability note with those formatters.\n\n* fix(hopper): stop restating which Ghidra lanes REA has verified\n\nHopper's refusal for families it declines carried its own table of\nwhich Ghidra lanes REA has verified (mips, riscv and powerpc verified,\nhexagon not). That restated the Ghidra provider's facts in Hopper and\ngoes stale whenever they change, the drift that made the Hexagon refusal\nwrong in the first place. Reading Ghidra's facts from Hopper would\ncouple the providers instead; no module in src/hopper imports from\nsrc/ghidra.\n\nThe table and hopperDeclinedGhidraLane are removed.\nhopperDeclinedArchitectureReason now states only what Hopper owns: it\ndoes not admit the family, and the Ghidra provider's lane reports\nwhether REA has verified it. The arm64_32 sentence is unchanged.\n\nThe test checks every declined family against the formatter: each\nreason names the family and Ghidra, and apart from the name all reasons\nare the same text, so none states a per-family Ghidra status.\n\n* fix(hopper): route declined families to Ghidra without promising its lane facts\n\nThe refusal said the Ghidra lane reports whether REA has verified it, but\nGhidra admits Hexagon with no such note, so a caller could not find the\npromised status. Hopper now only states that it does not admit the family\nand routes the caller to the Ghidra provider.\n\n---------\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>\nCo-authored-by: Kaoru0822 \nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: ShuaixinHuang <1836656514@qq.com>\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\nCo-authored-by: Henglie <90338155+Henglie@users.noreply.github.com>\nCo-authored-by: Cursor Agent \nCo-authored-by: 吴佳浩Alben <35291372+XiaoBinGan@users.noreply.github.com>\nCo-authored-by: Entrpi <133157614+Entrpi@users.noreply.github.com>\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["250dc81cd6b887f41a4078b65ca7a78628d1c541"], + "authors": [ + { + "name": "hhang", + "email": "17309584214@163.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Henglie", + "email": "90338155+Henglie@users.noreply.github.com", + "user": { + "login": "Henglie", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + }, + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + }, + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8015] + }, + { + "sha": "675d4076de1af5052f01709a9cf4cdf0cc3e2c67", + "subject": "test: strengthen regression oracles and cleanup ownership (#8152)", + "body": "test: strengthen regression oracles and cleanup ownership (#8152)\n\n* test: strengthen suite oracles and cleanup ownership\n\n* test: reuse setup across independent scenarios (#8153)\n\n* Potential fix for pull request finding 'CodeQL / Improper code sanitization'\n\nCo-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>", + "parents": ["1ddee1089b2300dc8220ade654cc73cd74d46a74"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Copilot Autofix powered by AI", + "email": "62310815+github-advanced-security[bot]@users.noreply.github.com", + "user": { + "login": "github-advanced-security[bot]", + "__typename": "User" + } + } + ], + "pullRequests": [8152] + }, + { + "sha": "0ffed7a48c43bcf1aef760d307be89f0a055ee4a", + "subject": "feat(android): trace callers of external DEX methods (#8154)", + "body": "feat(android): trace callers of external DEX methods (#8154)\n\nResolve exact external method targets from directly encoded DEX invokes.\nPreserve complete caller identity, bounded position evidence and follow-up\nselectors. Report aggregate position coverage independently of the caller\ninventory, and reuse bounded prototype facts within the exact session.\n\nAbsorbs #8096. Fixes #7811.\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>", + "parents": ["675d4076de1af5052f01709a9cf4cdf0cc3e2c67"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + } + ], + "pullRequests": [8154] + }, + { + "sha": "ebfef27b4682ed6ed47843bad641a6200bc1942b", + "subject": "fix(ci): consolidate shared timer limit export", + "body": "fix(ci): consolidate shared timer limit export\n", + "parents": ["0ffed7a48c43bcf1aef760d307be89f0a055ee4a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "96606f511455e5b3af1eb6aa14fc9e895f3e9efb", + "subject": "test(process): strengthen macOS token parser boundaries", + "body": "test(process): strengthen macOS token parser boundaries\n", + "parents": ["ebfef27b4682ed6ed47843bad641a6200bc1942b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "e5c46dff034fef432e772f669bc309f512a6b186", + "subject": "fix(javascript): emit no socket for a literal out-of-range port (#8137)", + "body": "fix(javascript): emit no socket for a literal out-of-range port (#8137)\n\n* fix(javascript): emit no socket for a literal out-of-range port\n\n`net` and `tls` validate a numeric port before creating a socket, so a literal\nport Node rejects throws synchronously and no socket exists — but the analysis\nreported an `acquire` operation.\n\nMeasured on Node 24.22.1:\n\n net.connect(0) / 80 / 65535 -> Socket created\n net.connect(65536) -> THREW ERR_SOCKET_BAD_PORT\n net.connect(-1) / 1.5 -> THREW ERR_SOCKET_BAD_PORT\n net.connect(NaN) / Infinity -> THREW ERR_SOCKET_BAD_PORT\n net.connect(1e400) -> THREW ERR_SOCKET_BAD_PORT\n net.connect(0n) / true / false -> THREW ERR_INVALID_ARG_TYPE\n net.connect(null) -> THREW ERR_INVALID_ARG_TYPE\n net.connect(\"\") -> THREW ERR_SOCKET_BAD_PORT\n net.connect(\"/tmp/x.sock\") -> Socket created (Unix socket path)\n net.connect({ port: 80 }) -> Socket created\n net.connect(undefined) / {} / [] -> THREW ERR_MISSING_ARGS (undecided)\n --- tls mirrors net ---\n tls.connect(80) -> Socket created\n tls.connect(65536) / -1 / NaN -> THREW ERR_SOCKET_BAD_PORT\n\nA string is a Unix socket path and an object may carry a path, so only an\nexactly readable non-port literal is decided. `undefined` and an empty object\nthrow `ERR_MISSING_ARGS`, which is a missing option rather than a bad port, so\nthey stay undecided. `NaN` and `Infinity` are identifiers rather than literals\nand are decided only through `isUnmodifiedGlobalReference`.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* fix(javascript): place the port check away from the fs flag check\n\n`#8125` adds an fs flag guard at the top of `collectAcquisitions` and this branch\nadded a socket port guard in the same spot, so the two conflicted on every\nrebase. The port check now filters the completed candidate list from\n`collectJavaScriptSemanticResources` and its helpers sit at the end of the file,\nwhich cannot collide with the fs flag guard.\n\n* fix(javascript): drop the redundant in-loop port guard\n\nThe caller now filters the completed candidate list, so the loop guard became\ndead code. Removing it also keeps this branch from editing the same lines as the\nfs flag guard in #8125.", + "parents": ["96606f511455e5b3af1eb6aa14fc9e895f3e9efb"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8137] + }, + { + "sha": "ca7d1c3750b244364b60cf2253c2c8c481b6dea7", + "subject": "fix(ghidra): match startup-timeout guidance to the project mode (#8114)", + "body": "fix(ghidra): match startup-timeout guidance to the project mode (#8114)\n\nIn fresh-import mode, the startup-timeout remediation now points to\nREA_GHIDRA_PROJECT_PATH for reusing a completed analysis, next to the\nexisting REA_GHIDRA_STARTUP_TIMEOUT_MS and REA_GHIDRA_DISABLED_ANALYZERS\nadvice.\n\nIn existing-project mode, the message no longer says Ghidra was\nimporting and analyzing the target, and the remediation no longer\nsuggests REA_GHIDRA_DISABLED_ANALYZERS, which configuration validation\nrejects together with REA_GHIDRA_PROJECT_PATH.\n\nRefs #3751", + "parents": ["e5c46dff034fef432e772f669bc309f512a6b186"], + "authors": [ + { + "name": "Machen John", + "email": "macjayzz1@gmail.com", + "user": { + "login": "macjayz", + "__typename": "User" + } + } + ], + "pullRequests": [8114] + }, + { + "sha": "69bf61f7c72740b2eb9cfbd1474bcd61771d688b", + "subject": "fix(browser): preserve event coverage for failed requests (#8158)", + "body": "fix(browser): preserve event coverage for failed requests (#8158)", + "parents": ["ca7d1c3750b244364b60cf2253c2c8c481b6dea7"], + "authors": [ + { + "name": "Harsh Bhardwaj", + "email": "151419535+HA2345567@users.noreply.github.com", + "user": { + "login": "HA2345567", + "__typename": "User" + } + } + ], + "pullRequests": [8158] + }, + { + "sha": "47fa6ab3795d547207001ffb01643c0aa39dcad8", + "subject": "feat(electron): report custom URL protocol registrations", + "body": "feat(electron): report custom URL protocol registrations\n\nExpose static Electron protocol call facts through the shared application graph and existing CLI/MCP Evidence views. Preserve canonical case-insensitive scheme identity, original spellings, exact source provenance and explicit unknowns; keep registration success and runtime routing unproven.\n\nIntegration fixes also enforce module-only privileged API ownership, reuse the shared finding-key owner, and align the owning type documentation with the Evidence semantics. Validation and bounded real Obsidian CLI/MCP measurements are recorded in the PR.\n\nCo-authored-by: UnknownHacker1 <35694178+UnknownHacker1@users.noreply.github.com>\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["69bf61f7c72740b2eb9cfbd1474bcd61771d688b"], + "authors": [ + { + "name": "Abdelrahman Teima", + "email": "35694178+UnknownHacker1@users.noreply.github.com", + "user": { + "login": "UnknownHacker1", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [2978] + }, + { + "sha": "d48e472fa6a664cacbb400560e673533005795ce", + "subject": "fix(mcp): preserve repeated HTTP host allowlists (#8164)", + "body": "fix(mcp): preserve repeated HTTP host allowlists (#8164)", + "parents": ["47fa6ab3795d547207001ffb01643c0aa39dcad8"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8164] + }, + { + "sha": "356cc50475cee0dfeb8114de5069ba4ed87a4568", + "subject": "docs: guide design and verification of provider workflows (#8261)", + "body": "docs: guide design and verification of provider workflows (#8261)\n\n* docs: guide provider workflow design and annotation comparisons\n\n* docs: connect provider tool design to workflow verification", + "parents": ["d48e472fa6a664cacbb400560e673533005795ce"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8261] + }, + { + "sha": "6e2404b8690f6faa75227d895c937be5b77ef238", + "subject": "fix(comparison)!: preserve same-entry correspondence across renames (#8263)", + "body": "fix(comparison)!: preserve same-entry correspondence across renames (#8263)\n\n* fix(comparison): preserve same-entry correspondence across renames\n\n* docs(comparison): align rename guidance and focused contract checks", + "parents": ["356cc50475cee0dfeb8114de5069ba4ed87a4568"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8263] + }, + { + "sha": "d9e01e5af2dda46f9c7adb6cfde82805845651e9", + "subject": "feat(evidence): aggregate exact retained comparison references (#8267)", + "body": "feat(evidence): aggregate exact retained comparison references (#8267)", + "parents": ["6e2404b8690f6faa75227d895c937be5b77ef238"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8267] + }, + { + "sha": "b349e3c708383d3c06dd18c036f9de681a207b70", + "subject": "fix(evidence): give missing retained closures actionable recovery (#8270)", + "body": "fix(evidence): give missing retained closures actionable recovery (#8270)\n\n* fix(evidence): give missing retained closures actionable recovery\n\n* refactor(evidence): assign retained lookup context at resolution", + "parents": ["d9e01e5af2dda46f9c7adb6cfde82805845651e9"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8270] + }, + { + "sha": "ec107022fac43708dd6b74c25e3d450653a50963", + "subject": "docs: guide audits of existing investigation tools (#8272)", + "body": "docs: guide audits of existing investigation tools (#8272)", + "parents": ["b349e3c708383d3c06dd18c036f9de681a207b70"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8272] + }, + { + "sha": "245a581818ab13694fa438a06e39898ce03ab206", + "subject": "feat(kuna): verify release 1.986 and guide version selection (#8187)", + "body": "feat(kuna): verify release 1.986 and guide version selection (#8187)\n\n* feat(kuna): verify release 1.986 and guide version selection\n\n* test(kuna): cover verified release doctor guidance", + "parents": ["ec107022fac43708dd6b74c25e3d450653a50963"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8187] + }, + { + "sha": "7ba3f558d436abcb6c70b2c0f9057732cdc3fa0e", + "subject": "fix(windows): keep polling owned process output after a failed poll (#8163)", + "body": "fix(windows): keep polling owned process output after a failed poll (#8163)\n\n* fix(windows): keep polling owned process output after a failed poll\n\n* test(windows): pin the failed-poll retry delay", + "parents": ["245a581818ab13694fa438a06e39898ce03ab206"], + "authors": [ + { + "name": "Jonnalagadda Sai Amarthya", + "email": "amarthyajonnalagadda2005@gmail.com", + "user": { + "login": "amarthya-14", + "__typename": "User" + } + } + ], + "pullRequests": [8163] + }, + { + "sha": "1dc97d8cece2eb68c0e72feb56c7a2821f23237c", + "subject": "fix(ghidra): report a missing existing-project program as a configuration error (#8222)", + "body": "fix(ghidra): report a missing existing-project program as a configuration error (#8222)\n\n* fix(ghidra): report a missing existing-project program as a configuration error\n\nWhen REA_GHIDRA_PROJECT_PATH selects a project that has no root program\nwith the selected name, Ghidra's headless analyzer aborts with\n\"Requested project program file(s) not found: \". REA reported this\nas a generic execution_failure with rea doctor advice, and the reason was\nvisible only in the captured diagnostics.\n\nRecognize that refusal in the operation-scoped launcher output, matching\nonly the exact name REA passed to -process, and return a\nConfigurationError for REA_GHIDRA_PROGRAM_NAME. The message says whether\nthe name was configured or defaulted from the target file name, and the\nremediation explains how to select the exact root program. The selected\nproject is unchanged and there is no fallback to a fresh import. Other\nlaunch failures keep their existing projection.\n\nFixes #8216\n\n* test(ghidra): assert missing-program guidance through its formatter\n\nCompare the projected setting constraint and remediation with\nghidraMissingProgramGuidance instead of freezing explanatory phrases,\nfollowing docs/testing.md. The program name and configured-or-defaulted\norigin are still checked independently.", + "parents": ["7ba3f558d436abcb6c70b2c0f9057732cdc3fa0e"], + "authors": [ + { + "name": "Machen John", + "email": "macjayzz1@gmail.com", + "user": { + "login": "macjayz", + "__typename": "User" + } + } + ], + "pullRequests": [8222] + }, + { + "sha": "091892dfedd9f50cc68c7bbb63e44d5ca1754fcb", + "subject": "test(ghidra): expect carved MIPS copies to be refused at target opening (#8227)", + "body": "test(ghidra): expect carved MIPS copies to be refused at target opening (#8227)\n\nSince 651afa445 target opening refuses every ELF declaration beyond EOF,\nincluding carved copies, and ac6e0e258 moved the carved MIPS boundary tests\nto that contract. The real-Ghidra MIPS lane still expected a carved image to\nresolve with section-table limitations and be refused later by Ghidra\nadmission, so verify:ghidra:mips failed at its first carved fixture.\n\nThe lane now requires open_binary and the CLI to refuse the carved copy as\ntarget_unavailable (file_format_rejected) with the exact declared\nsection-table range and captured size. The carve and that expectation live in\nthe shared MIPS checks, and a boundary regression applies them to the\nproduction resolver and error projection, so a later contract change fails\nwithout real Ghidra. The MIPS and PSP guides describe the current contract.", + "parents": ["1dc97d8cece2eb68c0e72feb56c7a2821f23237c"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [8227] + }, + { + "sha": "e6d0618979f0df3f1d5db218b0fc7b5e6a9cf3f9", + "subject": "feat(artifacts): inventory and extract ESP flash layouts (#8228)", + "body": "feat(artifacts): inventory and extract ESP flash layouts (#8228)\n\n* feat(artifacts): inventory and extract ESP32 firmware images\n\nESP32-family app and bootloader images (magic 0xE9) had no reader, so\nopen_binary refused OTA downloads, app partitions and bootloaders.\n\nAdd the esp-image container format behind inspect_artifact and\nextract_artifact. A pure decoder reads each byte once and keeps only\nfixed-size fields. Derived facts cover the chip, from a table cited to\nESP-IDF v6.1; segment classification as ESP-IDF's should_map and\nshould_load; checksum and appended SHA-256 results; app and bootloader\ndescriptors; Secure Boot v2 signature blocks, observed and unverified;\nand undescribed trailing byte ranges. Truncation and undescribed bytes\nmake coverage unknown. ESP8266 images are refused with a specific\nreason, and ciphertext stays unrecognized.\n\nAdd the format to every target, Evidence, snapshot, live-summary and\nartifact vocabulary, document it, and add an optional verify:esp-images\nlane that compares esptool-built images with esptool image-info and\nespsecure signature-info-v2.\n\nRefs #3615\n\n* test(artifacts): run the ESP image lane on esptool v5.6.0\n\nThe lane compared descriptor fields only when esptool image-info printed\none, so a descriptor that REA reports and esptool does not print passed\nwithout comparison. Compare the descriptor kind in both directions.\n\nRecord that the lane passed for all 13 images with esptool and espsecure\nv5.6.0, the version the layout facts cite, as well as with 4.12.0.\n\n* refactor(artifacts): define ESP image layout sizes once\n\nThe decoder and the derived facts each defined the segment-header,\nappended-digest and flash-sector sizes, the erased-byte scan and the\noffset formatter. Define them once with the other fixed-layout structures\nand import them in both places. The signature slot count is the one\nconstant that drives the slot scan.\n\nCorrect the observedEnd comment: it is the end of the last chunk read.\n\n* fix(artifacts): report ESP-IDF's segment length limit by chip\n\nESP-IDF's verify_segment_header rejects a segment of 16 MiB or more\nunless the chip maps flash through 32-bit cache addresses\n(SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP: ESP32-S3, P4, C5, C61, H4 and\nS31 in v6.1). Record that capability in the chip table and add a\nlimitation for such segments; unknown chips get none.\n\n`loaded` repeats should_load. It does not mean the bootloader accepts the\nsegment: verify_load_addresses still rejects one outside the chip's RAM,\nwhich REA does not model. Say so in the docs, the skill reference and the\ninventory limitation.\n\n* test(artifacts): check ESP lane tools first and verify extraction\n\nThe lane started work before checking its tools, so a missing RISC-V\ntarget, ld.lld, esptool or espsecure surfaced as a raw spawn or command\nerror. Check each one before building and name the variable to set. Warn\nwhen esptool is not v5.6.0, the release the layout facts cite.\n\nAssert each segment's class for the ESP32-C3 app, its variants and the\nbootloader, as the Xtensa image already did. Extract the app and the\nsigned image through the CLI and compare every file with the bytes at\nesptool's segment offsets or in the appended signature sector; the\nsource's SHA-256 must be unchanged and equal the reported root_sha256.\n\n* docs(artifacts): state what the ESP image lane does not establish\n\nThe Verification section listed the lane's checks but not its gaps: only\nESP32-C3 and ESP32 images come from a real producer, no real project\nbuild, OTA download or flash dump is inspected, no signature is verified,\nand the lane does not run in CI.\n\nRecord the timing of the final lane run on esptool v5.6.0.\n\n* fix(artifacts): compare ESP segment declarations\n\nSegment entries hash only their data, so compare_artifacts reported a\nsegment that moved to another load address with the same bytes as\nunchanged; only the image itself changed. Compare each segment's\nload_addr and data_len as its declaration, as Node SEA and PyInstaller\nmembers are compared, and count a changed declaration as a metadata\nchange, also when content is unavailable.\n\nHeader offsets are layout and the classification is derived, so neither\nis compared.\n\n* test(artifacts): run ESP lane commands as owned process trees\n\nThe lane ran its tools through execFile. A timeout killed only the direct\nchild, so a linker or assembler that Clang or GCC had started could keep\nrunning while the lane removed its workspace. Run every command through\ncreateVerifierCommands, check the tools inside withVerifierCleanup, and\nremove the workspace only after commands.close() has stopped every tree;\na failed close keeps the workspace.\n\nOnly a nonzero exit now counts as a refusal or an expected esptool\nfailure; timeouts and spawn failures propagate. Supervising each command\nroughly doubles the lane's run time.\n\n* test(artifacts): cancel ESP decoding after its first decoded chunk\n\nThe cancellation test requested cancel or close on setImmediate, which\ncan land while the file is still being opened and checked, so it never\nshowed that decoding had started. It also passed against a reader that\nignored both requests while decoding. Acknowledge the decoder's first\nchunk, then cancel or close, join the operation, and assert that no\nlater chunk reaches the decoder and that the reader ends closed.\n\n* docs(artifacts): record which ESP metadata comparison ignores\n\nSegments are compared by their declaration. The image's and the\nsignature blocks' format_metadata are not: every field comes from their\nown bytes, which content comparison already covers, and a block's\nimage_digest_matches follows the image's content.\n\n* feat(artifacts): inventory and extract ESP flash layouts\n\nA whole-flash dump of an ESP32-family chip was read as its bootloader\nimage, with the partition table, apps and data left as undescribed bytes,\nor refused when it began with erased flash. Read it as an esp-flash-image\ncontainer instead.\n\nThe partition table is decoded as esp_partition_table_verify accepts it\nand is found at the caller's partition_table_offset, at the default\n0x8000, or by scanning 0x1000-aligned sectors for a table whose MD5\nverifies, which the inventory reports as derived. The bootloader is\nlocated at its chip's ROM bootloader offset. Each partition is an entry\nwith its declaration in flat format_metadata; the bootloader and app\npartitions carry ESP image facts from the existing streaming decoder; the\notadata records are reported with a selection derived without rollback or\nanti-rollback, and the running partition stays unknown. One unreadable\npartition does not hide the others, and extraction writes every partition,\nnvs_keys included, as ordinary data.\n\nFlash layouts are detected before single ESP images. The scan runs only\nwhen an ESP image sits at a ROM bootloader offset, and is refused when a\nbootloader at another chip's offset shows that the dump does not start at\nflash address 0. open_binary gains flash_offset and partition_table_offset,\nwhich require format esp-flash-image and are part of the snapshot target\nidentity; the CLI takes them with --target-format esp-flash-image.\nComparison treats a partition's label, type, subtype, range and flags as\nits declaration.\n\n* test(artifacts): verify ESP flash layouts with gen_esp32part, merge-bin and otatool\n\nAdd the optional verify:esp-flash lane. It builds default and relocated\npartition tables with ESP-IDF's gen_esp32part.py, assembles dumps with\nesptool merge-bin, including one written from flash 0x1000, and writes\nOTA records with otatool through flash_file_tool.py, which replaces\nparttool's esptool calls with reads and writes of the dump file.\n\nIt compares REA's bootloader and app facts with esptool image-info, every\npartition with gen_esp32part.py's decoding of the extracted table, and the\nOTA records and derived slot with otatool read_otadata after each switch.\nIt also checks extracted bytes and source integrity, the scan and caller\ntable offsets, flash_offset on the 0x1000 dump, a corrupted app beside\nvalid partitions and a truncated dump. ESP32 linker scripts place the\nconformance bootloader and app in ESP32 address ranges.\n\n* fix(artifacts): read ESP flash layouts as the bootloader does\n\nRead the partition table as bootloader_utility_load_partition_table\ndoes: the last factory, otadata and same-subtype OTA declaration wins,\nand a limitation names repeats. Plan each otadata record within its\npartition and the dump. An otadata partition smaller than two sectors\nselects none, the bootloader's INVALID_INDEX; a record the dump lacks\nleaves the selection unknown while the other record stays reported. The\nfallbacks follow the bootloader's indexes: ota_0-fallback and\nfactory-fallback name no partition when the table declares none, and the\nassumptions add GPIO holds and deep-sleep wake.\n\nRefuse a dump whose bootloader contradicts its origin before the default\ntable offset is tried, whether flash_offset was omitted or given, and keep\nthe ESP image reader's ESP8266 refusal. A table never lies inside the\nlocated bootloader image, so single app images are no longer scanned. An\nexplicit esp-flash-image selection is decided before other container\nsignatures, and the native commands' --target-format no longer takes it.\nSay when no bootloader confirms the default origin.\n\nExempt the primary bootloader and partition_table entries of ESP-IDF 5.3\nfrom placement limits, report every region inside a longer one, and name\npartitions by index when labels repeat ignoring case. Keep an undecodable\nlabel's bytes in label_hex and compare them. Word undescribed ranges as\nstarting at a byte that is not erased, and treat a short erased region as\nerased.\n\nAdd an MCP compare_artifacts test for partition declarations, reader\nidentity and close tests, scan edge cases, the 0x2000 ROM offset and a\nliteral otatool CRC.\n\n* test(artifacts): verify ESP primary layout entries and the otadata fallback\n\nBuild a table with the primary bootloader and partition_table entries\nthat gen_esp32part.py fills from --primary-bootloader-offset, and check\nthat REA reads it with complete coverage, no overlap or misplacement\nlimitation, and a table that agrees with gen_esp32part's decoding. Erase\nthe otadata with otatool after the slot switches and check the records\nagainst read_otadata and the factory fallback.\n\n* fix(artifacts): keep ESP flash coverage complete for a dump cut short\n\nAn esptool merge-bin dump ends after the last part it wrote, usually inside\nits last partition. Such a partition made the layout's coverage unknown, so\nartifact comparison of two merge-bin dumps reported every unchanged\npartition as unknown.\n\nThe partition table names every partition whatever the file's length, so a\npartition cut short or left out by the end of the file hides no entry. As\nthe ESP image reader does for a cut-short segment, its entry holds the bytes\nthe file has and an entry limitation gives the declared size; a partition\nwith no bytes stays in partitions_outside_dump. Coverage stays complete\nunless undescribed bytes remain or no bootloader is located. An MCP\ncompare_artifacts test of two dumps that end inside ota_0 now classifies\nevery partition, and fails on the old rule.\n\n* fix(artifacts): report written bytes in ESP partitions, erased slots included\n\nAn app slot is erased for ESP-IDF's bootloader when its image header bytes\nare erased flash, and REA reported only that status. A slot can still hold\ndata further in: a dump read from a device held a complete older app image\n1 MiB into an OTA slot reported as erased, with no limitation.\n\nEach partition entry now records where the bytes the dump holds are\nwritten, relative to the partition: written_offset, the first byte that is\nnot 0xFF, written_end, just past the last, and written_bytes, how many are\nnot 0xFF. They are null for a partition outside the dump. The status stays\nerased, which is the bootloader's view, and a limitation names an erased\napp slot that holds written bytes and says they are not read as an image.\nThe reader reads every partition byte once more to find them.\n\n* fix(artifacts): derive the ESP boot selection for every partition table\n\nThe boot selection lived inside otadata, so a table without an otadata\npartition, the common factory-only layout, had none. ESP-IDF's\nbootloader_utility_get_selected_boot_partition returns the factory index\nwhen the table declares no otadata partition.\n\nMove it to a top-level boot_selection that every layout has. Its basis\nnames the bootloader's branch: otadata, factory-fallback and ota_0-fallback\nfrom the records, no-otadata for a table without otadata, none for the\nbootloader's INVALID_INDEX, and unknown when the dump lacks a record the\nbootloader reads, which replaces the null selection. running_partition\nmoves with it, and otadata keeps its partition index and records. The\nassumptions name what each branch leaves out: no records assumption\nwithout otadata, and none for none or unknown. The real-tool lane checks\nno-otadata on a table gen_esp32part built without otadata.\n\n* fix(artifacts): say when an ESP image is a flash dump read from 0x1000\n\nAn ESP32 dump read from flash 0x1000, as read-flash 0x1000 or merge-bin\n--target-offset 0x1000 writes it, opened automatically as its bootloader\nimage with a megabyte of undescribed bytes and no next probe. The flash\nreader refuses that origin, but nothing told an agent which flash_offset to\npass.\n\nespFlashDumpOrigin owns the inference: an image of a chip whose ROM loads\nthe bootloader from flash R, at file offset F, is the bootloader of a dump\nread from R - F when a partition table sits where that origin puts 0x8000.\nThe ESP image reader asks it for a non-app image at file offset 0, so the\nresult does not depend on how the reader was created, and records\nflash_dump {flash_offset, table_file_offset}, null otherwise, with a\nlimitation that says to reopen the file as esp-flash-image with that\nflash_offset. inspect_artifact proposes the same open_binary call as a next\nprobe, and the flash reader's misplaced-origin refusal names the offset.\n\n* perf(artifacts): summarize nested ESP images in the flash layout summary view\n\nThe summary view returned an ESP flash layout's root facts whole, so each\napp partition and the bootloader carried every segment and signature\nblock, about half of a dump's summary.\n\nThe summary view now gives each nested image a summary instead of its\nfacts: status, chip, entry point, segment count, load ranges (each mapped,\nloaded or unclassified segment's address and declared length), the\nchecksum and appended SHA-256 statuses, coverage and limitations. Complete\ndetail keeps the full facts, every segment included, and the retained\nEvidence is unchanged. On a 16 MiB device dump the summary's root falls\nfrom 5,141 to 2,657 bytes, and the summary Evidence from 10,038 to 7,554.\n\n* test(artifacts): expect the misplaced image the ESP bootloader search reports\n\n8a748d3cc added misplacedImage to the bootloader search, which the\nlocator uses to name the origin a misplaced bootloader implies, but one\ntest still compared the search result without it. Expect the image's\nchip and file offset, and no image for an unknown chip.\n\n* fix(artifacts): give every ESP partition from the dump's start an entry\n\nAfter ecbc1a772 kept coverage complete for a dump cut short, a partition\nwholly past the end of the file still had no entry, only a\npartitions_outside_dump row. Comparing a merge-bin dump with a full device\nread then reported that partition as added or removed, as if one table\ndid not declare it.\n\nEvery partition from the dump's first byte on is now an entry holding the\nbytes the file has: none for one past the end, with a limitation saying\nthe file holds none of its bytes, no image facts and null written fields.\npartitions_outside_dump keeps only partitions that begin before the dump's\nfirst byte, and coverage is unknown when one does, since it has no entry.\nTwo dumps that lack the same partition now compare it as unchanged, and a\ndump against a longer one reports the partition as changed; an MCP test\nof a merge-bin dump against a full one checks that no path is added or\nremoved.\n\nUnlike the ESP image reader, which marks a truncated image's coverage\nunknown because later segments and signature blocks may be hidden, the\nflash reader can list every partition from the table whatever the file's\nlength; only the entry limitation follows the image reader.\n\n* fix(artifacts): select no ESP app from a partition table the bootloader rejects\n\nboot_selection followed bootloader_utility_get_selected_boot_partition but\nnot the table check before it. For a table whose MD5 does not match, or\nthat has a second MD5 entry, esp_partition_table_verify fails, the\nbootloader selects no app and resets. REA still derived a slot from the\notadata records, although the table's own limitation said the bootloader\nrejects it.\n\nThe selection now has basis none, with no assumptions, for a table the\ndecoder marks invalid. It also follows two more branches of the\nbootloader: an otadata partition at offset 0, which the bootloader takes\nfor none, selects the factory index as no-otadata, and a table without an\nOTA app selects its fallback even when the dump lacks a record, since the\nbootloader then ignores the records.\n\nThe bootloader also rejects a table whose partitions end past the flash\nsize in its header. REA does not model that check; the format guide says\nso.\n\n* fix(artifacts): require the ESP dump origin's table to follow the image\n\nespFlashDumpOrigin named a later flash origin whenever a partition table\ndecoded where that origin puts 0x8000. Bytes inside the image's own\nsegments could be read that way, so an ESP32 bootloader whose segment data\nheld table-shaped bytes at file offset 0x7000 was reported as a dump read\nfrom 0x1000.\n\nThe table must now start at or after the image's end, the rule the locator\nalready applies to the default table. The ESP image reader passes the\nimage_end it decoded, or the file size for a truncated image; the flash\nreader's refusal passes the end of the misplaced image's segments. The\nbootloader search drops its misplaced flag, which only restated\nmisplacedImage, and the next probe formats offsets with offsetText.\n\nReader tests cover the 0x1000 and 0x2000 ROM offsets, a standalone\nbootloader, bytes that begin like a table, an app with a table at 0x7000\nand a table inside a segment; without the boundary check, three of them\nfail.\n\n* fix(artifacts): give the ESP flash summary its own kind and each image's identity\n\nThe summary view's ESP flash root kept kind esp-flash-image, so a consumer\nbound to kind could not tell an image's summary from its full facts, and\nthe advertised schema held two objects with the same kind const. It is now\nesp-flash-image-summary.\n\nThe per-image summary also dropped the descriptor, which is what tells two\napp slots apart, and named each image only by its partition index, which\nthe summary view, having no entry rows, could not resolve. Each nested\nimage now carries its entry path from the layout plan, in both views. The\nsummary adds the descriptor kind with its identifying fields (an app's\nproject_name, version, idf_ver, secure_version and app_elf_sha256; a\nbootloader's version, idf_ver and secure_version), the signature block\ncount and each load range's classification. Its enums and fields derive\nfrom the schemas that own them.\n\nAn MCP test reads a dump with an app in ota_0 and an erased ota_1 that\nholds older bytes: it checks both summaries, that the summary's inventory\nEvidence is the one the complete view returns with full facts, and the\nerased slot's written range.\n\n* test(artifacts): cover cancel and close during the ESP written-bytes scan\n\nThe written-bytes pass reads every byte of each partition the dump holds,\nchecking that the reader is open before each chunk, but only app decoding\nhad a cancellation and close test. A data partition, which only that pass\nreads, now holds 9 MiB; once the scan has examined its first chunk, a\ncancel rejects preparation with the caller's reason and a close with\nunavailable, and the scan examines no further chunk.\n\nThe erased-slot test now asserts the whole set of erased-slot limitations,\nso factory, ota_0 and nvs, which the bootloader reads or which are not app\nslots, are shown to have none.\n\n* docs(artifacts): re-time the ESP flash lane and state only observed causes\n\nThe lane ran again after its assertions changed; both esptool runs passed,\nand the timed run's figures replace the earlier ones. The erased-slot\nparagraph no longer names a cause for the older bytes, which REA cannot\nobserve, and the skill reference states that every table has a\nboot_selection in its own sentence, with the none basis for a table the\nbootloader rejects.\n\n* fix(artifacts): retire ESP flash members as the ESP image reader does\n\n#7498's maintainer commits made the ESP image reader keep a member owned\nuntil its consumer closes it, retire fully buffered bytes when\ncancellation arrives after production, and refuse to finish an inventory\npaused across close. The ESP flash reader was copied from the earlier\nreader. Main's shared stored-member lifecycle cases failed two of eight\nagainst it: a paused inventory completed after close, and buffered member\nbytes stayed readable after cancellation.\n\nGive the flash reader the same lifecycle and run the shared cases against\nit.\n\n* docs(artifacts): re-time the ESP flash lane after merging main\n\nThe lane passed again with esptool v5.6.0 and 4.12.0 on the merge of upstream main. Record the v5.6.0 run's time and peak resident set.\n\n* fix(artifacts): read ESP image Evidence recorded before flash_dump\n\nThe flash layout work made `flash_dump` a required field of the\n`esp-image` root metadata. Evidence recorded before it has no such\nfield, so newer REA rejected records that were valid when they were\nmade: `compare_artifacts` and `inspect_analysis_view` reported\n`evidence_integrity_mismatch` for them.\n\nThe field is now optional when read. A record without it parses as it\nis, so the graph digest it commits to still matches; nothing fills the\nfield in. The image reader still writes it for every image, and the\ninspection probe reads a missing field as no hint.\n\nA regression test recommits an image inventory without the field and\npasses it inline to `compare_artifacts` and `inspect_analysis_view`.\nAgainst a server built with the required field, `compare_artifacts`\nrejects it.\n\n* fix(artifacts): stop the ESP flash gap scan when the reader closes\n\nThe scan for the first written byte in each undescribed gap checked\nonly the caller's signal. `close()` marks the reader closed and waits\nfor preparation, so it waited while the rest of a long erased gap was\nread.\n\nThe gap scan now takes the reader's open check, as the written-bytes\nscan and the image decoder do, and checks it before each chunk. Tests\ncancel or close the reader after the scan's first chunk of a 9 MiB\nerased gap and confirm that no later chunk is examined.\n\n* fix(artifacts): name ESP partitions with Windows device labels by index\n\nThe safe-label rule accepted labels such as `NUL`, `con` or `COM1`, so\nextraction wrote `partitions/NUL.bin`. Windows reserves those names\nbefore any extension, and ordinary Windows tools cannot use such a\nfile.\n\nA label that is a Windows device name (`CON`, `PRN`, `AUX`, `NUL`,\n`COM0`-`COM9` and `LPT0`-`LPT9`, any case, alone or before a dot) now\ntakes the existing index fallback. The partition metadata and the\nentry's source path keep the label.\n\n* fix(artifacts): read ESP flash partitions' written bytes in one pass\n\nEach partition got its own scan of the bytes the dump holds, so\npartitions declared over the same bytes read them again and again.\nOverlaps only add limitations, so a crafted table reached this normally:\n94 overlapping partitions over a 32 MiB dump would examine about 3 GiB\nbefore the first entry.\n\nThe reader now reads the bytes the partitions cover once. Partition\nboundaries cut them into segments; one pass counts each segment's\nwritten bytes and bounds, and each partition's extent is the sum of the\nsegments inside it. Every partition keeps its own declaration, extent\nand limitations. The pass checks the reader's open state before each\nchunk, as the per-partition scan did.\n\nA test declares 60 partitions over one MiB, 40 over all of it and 20\nover its first half, and checks each partition's extent and the\noverlap limitations. The reader reads 1,113,256 bytes of the\n1,114,112-byte dump; one scan per partition read 52,493,480.\n\n* test(artifacts): fail the ESP lanes on failed commands and refusals\n\n`otatool` turned a nonzero exit into returned text, which its callers\ndiscarded, and `inspect()` returned `{ refused }`, which the flash lane\nnever checked. A failed command then surfaced later as a slot\nassertion, an output-parser error or a TypeError, hiding its cause.\n\nCommands the lanes need to succeed now reject with the output they\nexited with: `otatool` and `inspect()` do so through a shared\n`failedCommand`. An expected refusal is opt-in: `refusal()` returns\nREA's output and fails the lane when REA opens the file. The ESP image\nlane's two ESP8266 cases use it.\n\nChecked by calling `otatool` on a file without a table, `inspect()` on a\nfile REA refuses and `refusal()` on a file REA opens; each rejects with\nits cause.\n\n* fix(artifacts): require a partition entry in an ESP partition table\n\nThe decoder counted the slot, not the partitions, so a lone MD5 entry\nover the empty prefix, followed by the terminator, decoded as a table\nwith no partitions. Default and caller-selected detection then accepted\nthat empty layout, although the guide requires one partition.\n\nA table now needs one partition entry before its terminator. An MD5\nentry alone is refused as `entry 1 at 0x20 ends the table before any\npartition entry`. The cases cover the decoder and both automatic and\ncaller-selected location.\n\n* fix(artifacts): decode an image shared by ESP app partitions once\n\nEach app partition got its own decode, so app partitions declared over\nthe same bytes decoded and hashed the same image again and again, the\nsame pattern the written-bytes scan had. With 60 app partitions over\none 960 KiB image the reader read 64,029,736 bytes of a 1,114,112-byte\ndump.\n\nRegions with the same file range now share one decode; each keeps its\nown copy of the facts. Partitions with different ranges still decode\nseparately, because truncation can change the facts: at most one decode\nper partition the table holds, each within its partition.\n\nA test declares 60 app partitions over one image, 40 holding all of it\nand 20 cutting it short, and expects three decodes: the bootloader, the\nwhole image and the cut one. The 60-partition dump now reads\n2,161,864 bytes, as a dump with one app partition does.", + "parents": ["091892dfedd9f50cc68c7bbb63e44d5ca1754fcb"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [8228] + }, + { + "sha": "e669365c3b57cf49b4158334fa0a42efb117c320", + "subject": "feat(ghidra): admit RISC-V ilp32 ELF with a derived calling convention (#8229)", + "body": "feat(ghidra): admit RISC-V ilp32 ELF with a derived calling convention (#8229)\n\n* feat(ghidra): record the RISC-V float-ABI calling-convention decision\n\nDecision D3 (#7477), provisional: admit ELF32 soft-float (ilp32) RISC-V\nimages through a lane that keeps the pinned RISCV:LE:32:default language and\ncorrects the calling convention in the bridge.\n\nThis commit is the contract only; admission is unchanged.\n\n- The domain owns the e_flags float-ABI vocabulary and parses\n .riscv.attributes and Tag_RISCV_arch into a declared, absent or\n unavailable ISA declaration.\n- The Ghidra profile owns the lane table (class and float ABI), lane ids\n built from fields, the ilp32-prototype-v1 policy and its __rea_ilp32\n prototype, and the extensions Ghidra 12.1.4 decodes with p-code.\n- The session handshake accepts the bridge's calling-convention report.\n- docs/ghidra-riscv.md keeps the decision record and per-ABI policies for\n ilp32 and ilp32f; a test keeps it in step with the tables.\n- tests/conformance/c/riscv-float-abi.c is the source the policies were\n measured on.\n\n* feat(ghidra): admit RISC-V ilp32 ELF with a derived calling convention\n\nESP32-C2, C3, C5, C6, C61, H2 and H21 builds are ELF32 soft-float (ilp32)\nimages, which the RISC-V lane refused at its double-float check. Ghidra\n12.1.4's generic RV32 compiler specification models ilp32d, so its stock\nprototype would read float and double arguments from fa0-fa7.\n\n- Target resolution reads the one SHT_RISCV_ATTRIBUTES section through the\n same bounded ELF declaration reader as range validation, and records\n Tag_RISCV_arch as declared, absent or unavailable.\n- Admission selects a lane from the class and float-ABI table. The soft-float\n lane also requires an RV32I Tag_RISCV_arch that declares only extensions\n Ghidra decodes with p-code; the refusal names any others (Zcb, Zcmp, Zcmt,\n Zb*, xesp*).\n- Soft-float profiles commit float_abi, arch, riscv_calling_convention\n ilp32-prototype-v1 and the lane elf32-exec-le-soft-float-generic-v1.\n Double-float profiles are unchanged.\n- ReaGhidraRiscvCallingConvention.java runs after analysis. It derives\n __rea_ilp32 from the default prototype without floating-point entries and\n rules, with fs0-fs11 killed by calls, self-checks its storage and assigns\n it to every non-thunk function, external function and function\n definition. Its report is written last.\n- The provider client requires that report exactly when the profile commits\n the policy, before any operation, and keeps it as session limitations and\n caller-project history.\n\nELF32 single-float (ilp32f), quad-float and ELF64 soft- or single-float\nimages stay refused, now with a reason built from the lane table.\n\n* test(ghidra): verify RISC-V ilp32 against real Ghidra\n\nverify:ghidra:riscv now also builds tests/conformance/c/riscv-float-abi.c\nwith ESP32-C3's -march=rv32imc_zicsr_zifencei -mabi=ilp32, typed with DWARF\nand linked again with --strip-all. Every allocated section of the stripped\nimage must keep its address and bytes.\n\n- riscv-checks.mjs holds the ilp32 storage of each fixture function together\n with the words the compiler's call site writes there. An LLVM objdump\n reading of the caller must find every word at its stated location: an\n unaligned named double, the a7/stack split, two floats in an integer pair,\n a large structure by reference, aligned variadic pairs and an indirect\n call.\n- Through CLI and stdio MCP, the soft-float builds must report the soft-float\n lane and ilp32-prototype-v1, __rea_ilp32 with exactly that storage (one\n integer word per location when stripped), caller pseudocode that passes the\n source constants and names no floating-point register, the prototype\n outcome in retained Evidence, and decoded fence.i and csrr.\n- The RV32 double-float image relabelled as soft-float, refused before, is\n admitted through the new lane. RV64 soft-float, single-float and unsupported\n bits are refused with their reasons.\n- riscv-checks.test.ts runs the checks offline against recorded LLVM and\n Ghidra output, including Ghidra's stock ilp32d prototypes as a negative\n control.\n\n* fix(ghidra): pass RISC-V ilp32 values over 8 bytes by reference\n\nThe psABI passes any value wider than 2 x XLEN by reference, scalars\nincluded. __rea_ilp32 converted only structures and unions over 8 bytes to\npointers, so a long double (16 bytes) was joined into a1-a4. Measured on\nGhidra 12.1.4, rea_riscv_abi_quad(long double value, int sel) read value\nfrom a4:4,a3:4,a2:4,a1:4 and sel from a5, where clang passes a pointer in\na1 and sel in a2.\n\n- ReaGhidraRiscvCallingConvention.java now has one derivation driven by a\n per-policy row (floating-point entry size, preserved floating-point\n registers). Every policy inserts a rule before the input list's final\n join that converts any value of 9 bytes or more to a pointer; a return\n that size already becomes a caller buffer. The self-check requires a\n 16-byte value to pass by reference.\n- The fixture gains rea_riscv_abi_quad. The call-site oracle now checks the\n words the by-reference pointers point at, for the large structure and the\n long double, and the recorded data comes from an LLVM 19 build.\n- docs/ghidra-riscv.md: the decision record and the ilp32 policy row.\n\nilp32-prototype-v1 keeps its id: no release carries it yet.\n\n* test(ghidra): check RISC-V lane limitations by their facts\n\nThe limitation tests froze a full explanatory sentence, the note count and\narray positions, so a harmless rewording failed them: the pattern Greptile\nflagged on #7486. Assert the facts the notes must carry instead: the pinned\nlanguage, the static-linkage boundary, one note naming the declared ABI,\nthe ABI the pinned language models and the prototype REA applies, and the\ndeclared ISA.\n\n* test(ghidra): check return storage in stripped RISC-V ilp32 builds\n\nThe stripped branch of assertRiscvIlp32Storage compared parameter storage\nonly, so an inferred return that lost the high word of a register pair,\nsuch as rea_riscv_abi_wide at a0:4 instead of a1:4,a0:4, still passed.\n\nStripped returns must now use the typed build's storage, or none when the\nresult goes through caller memory. Recovered type names are still not\ncompared: a test accepts other type names and refuses the dropped high word.\n\n* docs(ghidra): record decision D3 as decided in #7477", + "parents": ["e6d0618979f0df3f1d5db218b0fc7b5e6a9cf3f9"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [8229] + }, + { + "sha": "22e5aa97af8d726400f3f932cae10e0083412038", + "subject": "feat(artifacts): inspect classic iNES container regions (#2816)", + "body": "feat(artifacts): inspect classic iNES container regions (#2816)\n\n* feat(artifacts): inspect classic iNES container regions\n\n* fix(artifacts): preserve iNES source disappearance as integrity failure\n\n* fix(artifacts): revalidate iNES source before parsing header\n\n* fix(artifacts): validate admitted roots before classification\n\n* fix(artifacts): normalize source loss during root hashing\n\n* fix(artifacts): bind iNES extraction admission to inventory\n\n* test(artifacts): clarify non-executing inspection wording\n\n* fix: preserve binary plist detection with extended magic probe\n\n* test(browser): wait for popup document loads before capture\n\n* fix(artifacts): honor cancellation across source validation\n\n* fix(artifacts): prefer artifact magic over implicit database suffix\n\n* fix(artifacts): select extraction readers from scanned format\n\n* fix(artifacts): complete prefix reads and share ZIP format admission\n\n* fix(browser): budget scenario cleanup for content drain and shutdown\n\n* test(artifacts): admit valid universal inputs before routing\n\n* test(artifacts): verify iNES workflows on macOS\n\n* test(ci): own iNES macOS coverage and portable fixture paths\n\n* fix: preserve cleanup retries and avoid duplicate inventory parsing\n\n* fix(contracts): share ZIP target formats across MCP lifecycle schemas\n\n* fix(target): preserve typed cancellation during descriptor admission\n\n* refactor(artifacts): use JSON-safe inventory producer output directly\n\n* test(artifacts): share file read setup and satisfy CI checks\n\n* fix(artifacts): classify changed admission as integrity failure\n\n* ci: run Mach-O summary delivery coverage on macOS\n\n* test(javascript): align parameter provenance with main contract\n\n* test(browser): await discoverable fixture pages before runtime verification\n\n* fix(artifacts): pass target metadata to format detection\n\n* fix(artifacts): bind extraction to opened target\n\n* fix: repair the static-check failures on the default branch (#2895)\n\n* fix: repair the static-check failures on the default branch\n\nThe default branch fails its own required `Static checks` job three ways, so\nevery pull request reports that job as failed regardless of its own change.\n\n- `npm run format:check` reports `src/domain/functionComparison.test.ts` and\n `src/ida/IdaOperationRunner.ts`.\n- `npm run lint` reports a duplicate `import { join } from \"node:path\"` in\n `tests/boundary/mcp/ghidraInventoryMcp.test.ts` (lines 4 and 17).\n- `npm run typecheck` reports `format: \"devin\"` missing from the client format\n union in `src/application/SupportedClients.ts`, and an unchecked index in\n `tests/boundary/cli/clientProfileLifecycle.test.ts`, whose pair array is\n inferred as `string[][]`.\n\nApply the pinned formatter, drop the duplicate import, list the `\"devin\"` format\nthat its own definition already uses, and mark the pair array `as const`.\n\nValidation: `npm run check:fast` and `npm run format:check` pass.\n\n* fix(setup): keep Devin on the JSON configuration dialect\n\n---------\n\nCo-authored-by: 吴佳浩 \nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\n(cherry picked from commit df3d96da801976fdbe37a726c2f4f84af8ffbf90)\n\n* fix(artifacts): bind session inventories to target identity\n\n* test(browser): bound fixture readiness acknowledgements\n\n---------\n\nCo-authored-by: 64579525 <17373302683@163.com>\nCo-authored-by: 吴佳浩Alben <35291372+XiaoBinGan@users.noreply.github.com>\nCo-authored-by: 吴佳浩 ", + "parents": ["e669365c3b57cf49b4158334fa0a42efb117c320"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "64579525", + "email": "17373302683@163.com", + "user": { + "login": "Zhong-fan", + "__typename": "User" + } + }, + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + }, + { + "name": "吴佳浩", + "email": "wujiahao@supremind.com", + "user": null + } + ], + "pullRequests": [2816] + }, + { + "sha": "b43c329df779708e43ae297f498a844e45d9c923", + "subject": "feat(artifacts): inventory and extract UF2 and DfuSe firmware containers (#8230)", + "body": "feat(artifacts): inventory and extract UF2 and DfuSe firmware containers (#8230)\n\n* feat(artifacts): inventory and extract UF2 and DfuSe regions\n\nopen_binary refused UF2 and DfuSe firmware containers as an unsupported\nformat, so inspect_artifact and extract_artifact could not show which\nbytes a drag-and-drop or DFU update writes at which addresses.\n\nUF2 is recognized by a complete first block with all three magic\nnumbers. Valid main-flash payloads are joined into address-contiguous\nregions per familyID, named family-0x/0x-0x.bin, and\nknown IDs are named from a small table copied from Microsoft's\nuf2families.json at a pinned commit. Numbering is counted per familyID\nand block count: absent, repeated, out-of-order and out-of-range block\nnumbers are reported, and absent blocks leave coverage unknown.\nNot-main-flash blocks are excluded and reported; file-container blocks\nare reported and leave coverage unknown; invalid blocks and a partial\nfinal block are excluded with their position. A rewrite of one address\nwith different bytes fails closed, naming both block spans.\n\nDfuSe is recognized only by its prefix together with a DFU 1.1a suffix.\nEach element becomes one region at its file range with its target's\nalternate setting and name. Structural faults fail closed with a byte\noffset; overlapping elements stay separate and are reported. A suffix\nCRC mismatch follows integrity_policy: fail refuses with a dfu-crc32\nintegrity error, and record-and-continue records a root contradiction\nthat extraction also carries.\n\nHEX, UF2 and DfuSe share one retained-region reader and one run\nmerger, so the HEX decoder and reader lose their private copies.\n\n* docs(artifacts): document UF2 and DfuSe images and their esptool lane\n\nDescribe recognition, region names, metadata, numbering, failures, the\nDfuSe suffix CRC under integrity_policy, and limits, and link the page\nfrom the CLI and firmware guides and the agent skill reference.\n\nnpm run verify:uf2 runs esptool merge-bin --format uf2 on generated\ninputs at known addresses, with and without MD5, with 256-byte\npayloads, and on a concatenation of two chips' outputs. Inspection and\nextraction through the built CLI must return every input at its address\nunder the familyID esptool itself reports.\n\n* fix(artifacts): accept both DfuSe image size conventions\n\nUM0391 calls DFUImageSize the file length, and dfu-util's dfuse-pack.py\nwrites that value, while ST's DfuFileMgr, MicroPython's dfu.py and pydfu\nleave the 16-byte suffix out. The decoder accepted only the second form,\nso it refused dfuse-pack.py output as malformed.\n\nAccept either value and keep the declared one in image_size; any other\nvalue still fails with the suffix offset and the file length. The tests\npin both producers' output for one image, CRC included, from their\nbuild() functions transcribed and run under Python 3.\n\n* fix(artifacts): keep reused UF2 block numbers from hiding missing blocks\n\nesptool numbers every merged input from 0, so two inputs with the same\nblock count share one numbering group. A block lost from one input left\nits number present in the other, and the file reported complete\ncoverage. Each block number now records the target addresses it was\nseen at: equal address counts are complete copies, a resend to the same\naddress is one block, and unequal counts make coverage unknown with a\nlimitation and ambiguous_numbering_group_count. sequence_count becomes\nnumbering_group_count, and region block positions become\nfirst_file_block and last_file_block.\n\nReview follow-ups in the same change:\n- compare_artifacts compares a DfuSe element's alternate setting and\n target name, so bytes moved to another device memory are changed;\n- the shared reader keeps no region bytes outside its map after close;\n- one domain type replaces four identical decoder failure types;\n- the UF2 decoder returns a typed limit instead of throwing on bytes\n beyond its admitted size, and caps retained regions, not runs;\n- DfuSe caps elements with bytes only, names empty elements and\n element-less targets, drops the constant bVersion and bcdDFU fields,\n and says whether the CRC matches when DFUImageSize fits neither\n convention;\n- classification evidence carries a suffix only when the probe saw the\n end, and root classification reads the tail only for a DfuSe prefix;\n- the UF2 domain region owns family_name, and the root records the\n family registry revision; the table's MIT notice is preserved;\n- docs pin the producer revisions (dfu-util ee6b393d and f9a537c9,\n MicroPython cb99ca98), give the MD5 structure's real meaning, and\n describe container contradictions in the MCP contract guide;\n- tests and the esptool lane add the equal-count inputs and a block\n lost from one of them, accepted boundaries beside each refusal, a\n DfuSe root larger than the classification prefix, and CLI refusals.\n\n* feat(artifacts): name the UF2 families that LibreTiny builds for\n\nLibreTiny writes UF2 for Realtek, Beken and Bouffalo Lab modules. The\nMicrosoft registry revision REA already cites (cf3bd7f9) lists eight of\nthose families: RTL8710A, RTL8710B, RTL8720C, RTL8720D, BK7231U, BK7231N,\nBK7251 and BL602. Their regions now carry those names. LN882H, which\nthat revision omits, keeps its familyID with no name.\n\n* fix(artifacts): count DfuSe declarations without bytes instead of listing them\n\nEmpty DfuSe elements have no entry, so DFUSE_MAX_ELEMENTS does not cap\nthem, and the target walk kept a description string for each one. At 8\nbytes per element, a file under the 128 MiB ceiling can declare about\n16.7 million of them. The walk now counts every declaration without bytes\nand builds only the first NAMED_ELEMENTS descriptions, which is all that\nthe limitation shows. The limitation text and empty_element_count do not\nchange. The guide now says that both DfuSe limitations name the first four.\n\nOn this host, decoding 4,000,000 empty elements (a 32 MB file) ran out of\nmemory under a 128 MB V8 heap before this change, and it peaked at 1.59 GB\nRSS with the default heap. It now decodes in 114 ms with a 220 MB peak.\n\n---------\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["22e5aa97af8d726400f3f932cae10e0083412038"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8230] + }, + { + "sha": "23de10bb2849cdce8ddbe70504aa7cc57de75a98", + "subject": "fix: streamline tests and preserve Darwin process ownership (#8275)", + "body": "fix: streamline tests and preserve Darwin process ownership (#8275)\n\n* test: strengthen suite guards and regression oracles\n\n* test: share JSON client registration contract\n\n* test: reuse fixtures and reduce repeated setup\n\n* fix(process): preserve ambiguous Darwin token ownership\n\n* test(process): bound child readiness waits", + "parents": ["b43c329df779708e43ae297f498a844e45d9c923"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8275] + }, + { + "sha": "a989c0e458c91af177e097abd7be0fd021b0401d", + "subject": "refactor(evidence): unify retained inputs across domains (#8299)", + "body": "refactor(evidence): unify retained inputs across domains (#8299)\n\nDeclare logical Evidence sources once and resolve exact retained inputs through\nshared application workflows across 20 composition tools. Preserve domain-owned\nauthentication, source closure, caller choices, coverage and resource admission.\n\nValidation includes public CLI/MCP regressions, local Codex terra/high trials\nand fresh-import real-artifact workflows. Measurements, failed attempts and\ncoverage limits are recorded in docs/verification/evidence-input-composition-2026-10-31.md.\n\nFixes #8293.\nFixes #8281.\n\nAssisted-by: Suika (gensokyo-skills:suika-scatter-gather-planning)", + "parents": ["23de10bb2849cdce8ddbe70504aa7cc57de75a98"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8299] + }, + { + "sha": "7c9ed94259fef560fdbec0c9b640348c5d54c391", + "subject": "fix(ghidra): decide batch names independently of request order (#8306)", + "body": "fix(ghidra): decide batch names independently of request order (#8306)\n\n* fix(ghidra): decide batch names independently of request order\n\nThe Ghidra bridge applied set_addresses_names in JSON member order, each\naddress in its own transaction, so a reordered but equivalent map could give\na shared name, or a name released by another selected address, to a\ndifferent address.\n\nThe bridge now resolves every destination (namespace and leaf name) against\nthe names held before the batch. Addresses that request the same destination,\nor a name that another selected address holds, are rejected without applying;\nthe remaining edits are independent and apply as before. Both naming\noperations report each failure's canonical address, reason and related\naddresses. The adapter projects the bridge reply to the unchanged boolean\nresults and keeps the reply as raw_result only when an address failed.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(ghidra): report each contested batch name once\n\nA batch conflict listed every other requester on each failure, so k\naddresses competing for one name produced k(k-1) related addresses, and\nthe adapter retained the whole reply, booleans included, as raw_result.\n\nThe bridge now reports each contested destination once in a conflicts\ntable with its namespace, name, requesting and holding addresses, and\neach conflict failure refers to it by index. Conflicts are ordered by\ntheir first requester, so indexes do not depend on member order. Single\nand batch naming share one planner and reply layout. The adapter\nvalidates the table in linear time and keeps only failures and conflicts\nin raw_result.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["a989c0e458c91af177e097abd7be0fd021b0401d"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8306] + }, + { + "sha": "c287a73276a7f751ca65a8cc2219a29d5914bc2c", + "subject": "fix(ghidra): report unbacked file-offset addresses without schema repair (#8308)", + "body": "fix(ghidra): report unbacked file-offset addresses without schema repair (#8308)\n\n* fix(ghidra): report unbacked file-offset addresses without schema repair\n\naddress_to_file_offset projected a well-formed address in uninitialized\nor unmapped Ghidra memory as generic invalid input: the headline said the\narguments were invalid and recovery pointed at the input schema, while the\nreal reason survived only in a nested issue.\n\nThe bridge now gives each outcome its own code (address_unmapped,\naddress_uninitialized, file_mapping_absent, file_mapping_ambiguous,\nfile_offset_unrepresentable) instead of folding them into invalid_request.\nThe Ghidra projection keeps the bridge reason as the headline, points to\ninspect_native_load_image, records the caller's exact address and the\nfile_mapping outcome, and scopes diagnostics to the request.\nAnalysisInputError gains conformsToInputContract so a conforming request\nomits recovery.kind=inspect_input_contract. Malformed addresses and other\nbridge refusals keep their existing projection.\n\nFixes #8244\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(ghidra): match fixture block ends to bridge conventions\n\nThe fake bridge treated .text's exclusive list_segments end (0x1100) as an\ninclusive bound, so address_to_file_offset mapped an address outside the\nblock. Give the fixture's blocks one owner (start and size) and derive each\nreply from the production bridge convention: exclusive list_segments ends,\ninclusive byte-search coverage, half-open containment for file offsets.\n\nAdd an MCP boundary test that reads the block edges from list_segments and\nsearch_bytes, maps the last file-backed byte and refuses the first address\npast each block with its outcome code.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["7c9ed94259fef560fdbec0c9b640348c5d54c391"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8308] + }, + { + "sha": "73ff6ca0c8634aca1371f33219b94161d5bcf70c", + "subject": "fix(native): separate value-trace page omission from traversal truncation (#8309)", + "body": "fix(native): separate value-trace page omission from traversal truncation (#8309)\n\ntrace_native_values set one truncated flag for two different facts: the\nreturned page omits retained nodes, and a budget stopped or narrowed the\ntraversal. A last page of a complete trace and a node- or edge-capped trace\nboth reported truncated: true with next_offset null and no unknown naming the\ncap, so a caller could not tell whether to follow pages, raise a budget, or\ntreat the examined graph as exhausted.\n\nResults now carry page_truncated for page omission and a traversal object\nthat is complete, or truncated with the observed reasons in schema order:\nmax_depth, max_functions, max_call_sites, max_nodes, max_edges,\nnode_payload_bytes, provider_pcode_truncated and ambiguous_call_candidates.\ntruncated keeps its previous meaning as the union of both.\n\nA new budget owner admits nodes and edges and records every cause together\nwith a located unknown, only after a budget rejects work; an exactly filled\nbudget is no longer truncation. Depth and ambiguous-candidate limits are\nresolved after traversal, so a destination analyzed or queued through a\nshallower path is no longer reported as depth-limited. Once an edge is\nrejected, remaining call sites in that procedure are not resolved.\n\nFixes #8283\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["c287a73276a7f751ca65a8cc2219a29d5914bc2c"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8309] + }, + { + "sha": "da0e9669a8c27a0298bccbe1914af96c83849ead", + "subject": "fix(decompile): keep provider no-pseudocode facts on batch items (#8323)", + "body": "fix(decompile): keep provider no-pseudocode facts on batch items (#8323)\n\n* fix(decompile): keep provider no-pseudocode facts on batch items\n\nA batch_decompile item whose provider answered without pseudocode was\nreported as unreadable output with doctor guidance, and the provider's\nreason, such as a Kuna export failure for that entry, survived only in the\nbatch-wide limitations. The workflow read only the observation's result.\n\nRead each item's complete observation. A null answer is now a\ncapability_unavailable item naming the provider, and every item answered\nwithout usable text keeps that observation's own limitations, so a\nbatch-only Evidence export retains the association. Empty or non-text\npseudocode stays unreadable output; typed provider failures and successful\nitems are unchanged, and the batch Evidence still aggregates every caveat.\nThe batch workflow revision changes so earlier snapshots are not replayed\nwith the previous item semantics.\n\nFixes #8226\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(decompile): match null-pseudocode guidance to reported caveats\n\nA null answer without caveats told the caller to read item limitations\nthat the batch omits when the list is empty. The guidance now depends on\nwhether that observation reported caveats, and says the provider gave no\nfurther explanation when it did not.\n\nThe batch tests now select their contracts by name from the enhanced and\nsession families instead of the full catalog.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["73ff6ca0c8634aca1371f33219b94161d5bcf70c"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8323] + }, + { + "sha": "2d5dec26c31662764c9adfe3ff996174901b8d49", + "subject": "fix(ghidra): assemble the Swift verifier's unresolved-jump fixture before linking (#8325)", + "body": "fix(ghidra): assemble the Swift verifier's unresolved-jump fixture before linking (#8325)\n\nswiftc rejects assembly sources as inputs, so verify:ghidra:swift failed\nduring fixture preparation before any provider check. Assemble both\nassembly fixtures to objects with xcrun clang and link only objects.\n\nFixes #8188\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["da0e9669a8c27a0298bccbe1914af96c83849ead"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8325] + }, + { + "sha": "60149282fcfc05ac32fbc94434c107710120da6f", + "subject": "test: strengthen integration oracles and verification (#8295)", + "body": "test: strengthen integration oracles and verification (#8295)\n\n* test: strengthen integration oracles and verification\n\n* test: bound lifecycle gates and strengthen workflow checks\n\n* test: verify complete paged and extracted results\n\n* test: preserve bytecode and cancellation evidence\n\n* test: strengthen retained evidence and fixture cleanup\n\n* test: require cross-projection bridge identities\n\n* test: retain fixture owners through cleanup failures\n\n* test: verify graph examples and project selectors\n\n* test: tighten provider and lifecycle regressions\n\n* test: consolidate hex coverage and bound cutter cleanup\n\n* test: bound subprocess output waits and strengthen graph checks\n\n* test: check mcp recovery and preserve cleanup owners\n\n* test: verify structured mcp argument failures\n\n* test: preserve artifact cleanup and gdb limit evidence\n\n* test: preserve evidence identities and bound provider gates\n\n* test: retain browser and comparison cleanup owners\n\n* test: bound startup and strengthen fixture oracles\n\n* test: bound lifecycle gates and verify recovered evidence\n\n* test: verify public outcomes and lifecycle ownership\n\n* test: assert precise evidence and release lifecycle gates\n\n* test: verify selected facts and bound cleanup waits\n\n* test: check retained evidence and decoded records\n\n* test: verify final reports and retain cleanup ownership\n\n* test: bound reviewed startup gates and retain cleanup\n\n* test: verify PE errors and preserve MCP cleanup\n\n* test: preserve MCP fixture cleanup ownership\n\n* test: release provider gates before late startup", + "parents": ["2d5dec26c31662764c9adfe3ff996174901b8d49"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8295] + }, + { + "sha": "41e7333cb5e0a755b7fd07d6dd6e7148a38a5658", + "subject": "feat(guidance): distinguish focused matches from broad parent sections (#8305)", + "body": "feat(guidance): distinguish focused matches from broad parent sections (#8305)\n\n* feat(guidance): distinguish focused matches from broad parent sections\n\nGuidance search treated a parent section, including every descendant, as one\nmatch. Terms scattered across unrelated subsections made a 49K-character root\nthe only result for \"switch provider annotations\", and every ancestor of a\nfocused hit was listed alongside it.\n\nThe section parser now records each section's own text (heading and body\nbefore its first subsection) and its parent. Search keeps the same admission\nrule but classifies each match by match_scope: \"section\" when every term is\nin the section's own text, \"subsections\" when the terms are only spread\nacross subsections. Ancestors whose terms all sit inside one subsection are\nno longer listed, section matches rank first, and subsections matches carry\nown_text_terms plus bounded greedy pointers to the subsections holding the\nremaining terms. Every match reports content_length so callers can judge a\nread before making it. Read still returns the complete section.\n\nOwn text is tokenized once per request instead of each expanded subtree.\n\nFixes #8290\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(guidance): require the scattered-match checks to run\n\nCount the subsections matches the real-bundle test inspects and fail when\nnone were checked, and document that a parent whose own text holds every\nterm stays listed beside its matching subsection.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["60149282fcfc05ac32fbc94434c107710120da6f"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8305] + }, + { + "sha": "c534e249d1838fdb6328e133fa109cc6684cc6da", + "subject": "perf(process): reuse a verified Darwin ownership helper across processes (#8318)", + "body": "perf(process): reuse a verified Darwin ownership helper across processes (#8318)\n\n* perf(process): reuse a verified Darwin ownership helper across processes\n\nEvery REA process on macOS compiled the Swift ownership helper into a fresh\ntemporary root and then paid macOS's first-launch assessment of that new\nexecutable: 408 ms + 325 ms of a 1.4 s `rea inspect-macho /bin/ls`.\n\nWith the default xcrun compiler and module cache, the reader now keeps one\ncontent-addressed copy under ~/Library/Caches/rea/process-helper//.\nThe key covers the helper sources, toolchain selection, architecture and\nDarwin release. A copy is executed only after the cache root, entry and\nfiles are verified as current-user owned, not group- or world-writable,\nnot links, and digest-matched to the entry manifest. Malformed entries\nowned by the user are removed and rebuilt; linked or foreign entries are\nleft untouched and the per-process compile runs as before. Any cache\nfailure falls back to that compile, so the cache never fails an ownership\noperation.\n\nA miss compiles exactly as before, then publishes a copy through an atomic\nrename, keeping the first concurrent publisher, and runs the shared copy.\nThat way its first-launch assessment is paid once. Per-run roots keep their\nexisting cleanup; published entries are never removed by close or exit.\nAn explicit REA_DARWIN_SWIFTC_PATH or REA_DARWIN_MODULE_CACHE_PATH keeps the\nper-process compile and writes nothing to the cache. `rea uninstall\n--purge-data` removes the namespace.\n\nFixes #2483\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(process): harden the shared Darwin helper cache\n\nAddress review findings on the shared ownership-helper cache:\n\n- Verify every real parent of the cache root: each must belong to the user\n or root and not be writable by others (sticky root-owned directories\n excepted), so no other user can rename a verified entry. Execute through\n the real path.\n- Open manifest and helper through the owned non-blocking regular-file\n reader, so a FIFO cannot block preparation, and retain handles whose close\n fails.\n- Key entries on the swiftc and SDK that xcrun itself resolves, including\n their real paths, sizes and modification times. DEVELOPER_DIR, TOOLCHAINS,\n xcode-select and in-place updates therefore select new entries.\n- Never remove or replace an invalid or published entry. Removal could race\n another process that has verified or is running that path, so such an\n entry falls back to the per-process compile.\n- Give the cache a close() that retries retained staging removals and\n handle closes and reports ProviderCleanupError while any remain. The\n reader closes it with its per-run root.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(process): keep cache lookups owned and fall back from unlaunchable helpers\n\nAddress the second round of review on the shared ownership-helper cache:\n\n- Pass the preparation signal to both xcrun toolchain lookups, and wait for\n every started lookup before reporting the first failure. Cancellation and\n close then stop a stalled lookup instead of waiting out its deadline.\n A failed or cancelled key computation is retried by the next lookup.\n- When the verified shared copy cannot launch (EACCES, EPERM, ENOEXEC,\n ENOENT or an unrequested SIGKILL, for example from a noexec home volume),\n the reader stops using the cache. It reuses its own compiled helper or\n compiles one, and retries the read once.\n- Anchor the cache's returned cleanup errors as cleanupRoot does, so every\n error returned while cleanup was pending resolves after a retry succeeds.\n- Build the cache path with appendCallerPath, so a home with symlinks and\n `..` keeps the caller's meaning instead of being normalized lexically.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(process): keep concurrent fallbacks and dual cleanup failures\n\nEach helper read now records before awaiting whether it launched the shared\ncopy, so a concurrent read's fallback cannot hide its own. When the per-run\nroot and the cache's retained resources both fail one close, the returned\nerror composes both. It stays incomplete until both owners recover.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(process): refuse shared helpers that an ACL lets others write\n\nmacOS ACLs can grant writes that the POSIX mode bits do not show. On\nDarwin, lookup and publication list the real ancestors, the entry and its\nfiles with `ls -lde`, and refuse sharing when any ACL entry allows a\nwrite-class right. The default `group:everyone deny delete` entries on\nmacOS home folders are unaffected. The unlaunchable-helper test now removes\nthe execute bit from a verified copy, which refuses launch on both Linux\nand macOS.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["41e7333cb5e0a755b7fd07d6dd6e7148a38a5658"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8318] + }, + { + "sha": "8a6ddec83ae5a5a538d1ffcff5d00173fa116611", + "subject": "fix(mcp): name the close_binary retry for retained cleanup (#8329)", + "body": "fix(mcp): name the close_binary retry for retained cleanup (#8329)\n\n* fix(mcp): name the close_binary retry for retained cleanup\n\nA close_binary that retired its target but could not confirm cleanup\nreturned cleanup_incomplete with retryable: false and only the generic\n\"Review the reported local resources\" remediation, although the session\nkeeps every failed owner and the next close_binary on the same connection\nretries them. Agents could abandon the connection that owns the only retry.\n\nThe MCP close tool now passes its retry operation to the session. The\nsession binds that typed AnalysisCleanupRetry to a failed retirement only\nwhile it retains the cleanup for its next close; the close tool binds it to\nprocess-capture failures its own scope retains and to compositions whose\nsession part was offered. Projection then reports\nrecovery.kind=retry_cleanup and appends a conditional instruction: keep the\nconnection, let the condition settle or resolve it, call close_binary\nwithout snapshot_path and check the result. The hint disappears once that\ncleanup resolves. retryable keeps describing the failed operation.\n\nOne-shot CLI closes, open_binary, analysis tools and failed snapshot saves\n(which keep the target open) offer no retry. Cleanup composition copies the\nowner's remediation without a retry offer, so the text appears once.\n\nFixes #8211\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test: derive close retry guidance from its owning formatters\n\nThe new close_binary retry assertions froze ProviderCleanupError's\nexplanatory sentence, so a harmless wording edit would break them. The MCP\ntest now compares delivered remediation with analysisErrorRemediationAction\napplied to the delivered typed error plus cleanupRetryRemediation. The\ndomain tests use the same formatters, check that unbound and released errors\ncarry no retry text, and check that a bound composition adds the offer once.\nRecovery fields, cleanup state and retry behavior keep separate assertions.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["c534e249d1838fdb6328e133fa109cc6684cc6da"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8329] + }, + { + "sha": "a36c9dd9c8d2ff1a1a3d1d16ad30753b84b7946d", + "subject": "fix(kuna): omit Mach-O data symbols from the procedure inventory (#8335)", + "body": "fix(kuna): omit Mach-O data symbols from the procedure inventory (#8335)\n\n* fix(kuna): omit Mach-O data symbols from the procedure inventory\n\nKuna's `functions --json` registers every Mach-O export as a function\nentry, so globals in `__DATA,__data`, constants in `__TEXT,__const` and\n`__mh_execute_header` were listed, counted and decompiled as procedures.\n\nThe Kuna session now classifies each inventory entry with the target's own\nsection table, read by the shared `inspect_macho` load-command reader from\nthe header bytes kept while its private copy is hashed. Entries in sections\nthat declare no instructions, or in the header and load commands, are data:\nlistings and searches omit them and report per-region counts, and\nprocedure operations refuse them by name or address while `address_name`\nand `xrefs` still accept them. Instruction sections, symbol stubs and\nsymbol-pointer import slots are kept; addresses outside every section stay\nwith an explicit limitation, an unreadable section table keeps the whole\ninventory unclassified, and ELF inventories are unchanged. Composed\nworkflows such as `decompile_all` and `binary_overview` follow the listing.\n\nFixes #8168\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(kuna): keep an entry's classification caveat on direct answers\n\nResolution now returns the selected entry's Mach-O placement and the\ncaveat it leaves open, built by the same constructor as the listings: the\none-entry unplaced wording, or the unreadable section table's reason.\nPseudocode, assembly, analyze_function (including the dossier's own\nlimitations), procedure_address, call queries by name and address_name\ncarry it; code and import-slot entries carry none.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["8a6ddec83ae5a5a538d1ffcff5d00173fa116611"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8335] + }, + { + "sha": "d2518a19f88509d691ea78f9265680bbf690ff18", + "subject": "feat(native): label binary overview counts with their inventory scope (#8338)", + "body": "feat(native): label binary overview counts with their inventory scope (#8338)\n\n* feat(native): label binary overview counts with their inventory scope\n\n`binary_overview` described its counts as \"exhaustive\", and its result was\na pair of bare scalars. An agent could read them as a discovery of every\nfunction and string in the file, or as comparable across providers. They\nare exact totals of the rows each provider's inventories return.\n\nThe shared `projectBinaryOverview` now adds one provider-neutral\n`inventory_coverage` record, so Ghidra's direct summary and the\nlisting fallback carry the same record:\n`{ scope: \"provider_inventory\", discovery_coverage: \"unknown\" }`.\nThe record reuses the `discovery_coverage` vocabulary that\n`list_procedures({detail:\"summary\"})` already reports, now owned by one\ndomain schema. The tool description states the scope and that counts are\nnot comparable across providers. Counts, segment omission semantics and\nlimitations are unchanged.\n\nFixes #8287\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): label overviews in the workflow so older snapshots stay valid\n\nAnalysis snapshots replay the projected inventory summary. A snapshot saved\nbefore inventory_coverage existed would then fail the overview output schema.\nThe record describes what overview counts mean, whoever produced them, so\nthe binary_overview workflow now adds it on both its provider-summary and\nlisting paths. Provider values and projectBinaryOverview are unchanged, and\nthe composed overview's linked atomic record stays as the provider\nreported it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): refresh composed overviews from before inventory_coverage\n\nBump the binary_overview workflow revision to 5, so snapshot and CLI replay\nrecompute a revision-4 composed overview from its atomic record. Replay\nwould otherwise return the cached overview without its count labels. The\nrevision-4 case joins the existing refresh scenario. The atomic Evidence\nis not rewritten.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["a36c9dd9c8d2ff1a1a3d1d16ad30753b84b7946d"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8338] + }, + { + "sha": "d54a4661da20382ad8456564a08569fdd24131c5", + "subject": "fix(ghidra): compare the DOS verifier's CLI window before its own rename (#8339)", + "body": "fix(ghidra): compare the DOS verifier's CLI window before its own rename (#8339)\n\nThe DOS verifier compared a fresh CLI session with an MCP session that\nits address-boundary helper had renamed and restored, so the entry's\nsymbol source differed (imported vs user_defined). Compare the CLI with\nthe pre-edit MCP window, then assert the restoration changes only the\nsymbol provenance.\n\nFixes #8189\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["d2518a19f88509d691ea78f9265680bbf690ff18"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8339] + }, + { + "sha": "f72638f6b1f1a41851bf321472569c3265556961", + "subject": "feat(investigation)!: retain records across engine cleanup (#8361)", + "body": "feat(investigation)!: retain records across engine cleanup (#8361)\n\nSeparate engine cleanup, investigation reset and terminal disposal in the shared application owner. Keep stable Evidence IDs and full Unknown revision history through engine close and target changes; serialize reset with all record writers and cleanup owners, optionally acknowledging a complete checkpoint before clearing. Bound retained representation without eviction.\n\nValidation: 43 focused files / 533 distinct tests, source/type/lint/schema/documentation checks, nine genuine source cases across eight families, real Ghidra session identity and cleanup, and nine actual local Codex CLI terra/high runs with independent full-result and checkpoint audits. See docs/verification/investigation-lifecycle.md for measurements, partial attempts and verification limits.\n\nFixes #8347.\n\nBREAKING CHANGE: close_binary retains investigation records. Use reset_investigation to clear them. Cross-process recovery requires an explicitly acknowledged Evidence bundle checkpoint.\n\nAssisted-by: Suika (gensokyo-skills:suika-scatter-gather-planning)", + "parents": ["d54a4661da20382ad8456564a08569fdd24131c5"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8361] + }, + { + "sha": "6e9ee97a69cb16c7150d8b550e705cba055ee4f0", + "subject": "fix!: preserve feature traces when owner lookup is unavailable (#8368)", + "body": "fix!: preserve feature traces when owner lookup is unavailable (#8368)\n\n* fix!: preserve feature traces when owner lookup is unavailable\n\n* test: strengthen feature trace cancellation assertions\n\n* fix: preserve feature trace provider readiness errors\n\n* test: verify all feature trace reference sources\n\n* test: verify IDA guidance at its owning boundary\n\n* style: format feature trace regression", + "parents": ["f72638f6b1f1a41851bf321472569c3265556961"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8368] + }, + { + "sha": "e18594b24754ab95ebd119311cc32a1d1ad6fa13", + "subject": "refactor(composition): unify capability bindings and cleanup ownership (#8441)", + "body": "refactor(composition): unify capability bindings and cleanup ownership (#8441)\n\nBind typed service creation, observed availability and retryable cleanup in one composition owner. Reuse selected CLI/MCP factories and canonical contract groups without copying provider operation inventories.\n\nCloses #8429. Refs #740.\n\nValidated paired real application workflows, actual local Codex CLI Terra/high use, complete Evidence and Unknown checkpoint parity, compiler-backed import boundaries, SDK schemas and final real mixed routing. Automated review findings were fixed at their producing owners. Existing exact-base CodeQL alerts are documented on the PR under the owner-authorized unrelated-check exception; no global alerts or security rules were changed.\n\nAssisted-by: Suika (gensokyo-skills:suika-scatter-gather-planning)", + "parents": ["6e9ee97a69cb16c7150d8b550e705cba055ee4f0"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8441] + }, + { + "sha": "a6caa79bf4f393c02601fbf2f6df246eae0b1558", + "subject": "ci(codeql): separate production scans from test fixtures (#8450)", + "body": "ci(codeql): separate production scans from test fixtures (#8450)", + "parents": ["e18594b24754ab95ebd119311cc32a1d1ad6fa13"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8450] + }, + { + "sha": "1c1c8f628608d5aa6d4ea5378b560d8263542cdc", + "subject": "fix(snapshot): report binding mismatches (#8432)", + "body": "fix(snapshot): report binding mismatches (#8432)\n\n* fix(snapshot): report binding mismatches\n\n* test(snapshot): assert structured mismatch recovery\n\n* docs(snapshot): explain profile comparison recovery\n\n* fix(snapshot): include profile in recovery advice\n\n* docs(snapshot): explain fresh-session profile discovery\n\n* refactor(snapshot): derive admission from binding comparison", + "parents": ["a6caa79bf4f393c02601fbf2f6df246eae0b1558"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8432] + }, + { + "sha": "7c755f2147528151d8186278d1c739fbf455f238", + "subject": "fix: retain address context cleanup failures (#8417)", + "body": "fix: retain address context cleanup failures (#8417)", + "parents": ["1c1c8f628608d5aa6d4ea5378b560d8263542cdc"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8417] + }, + { + "sha": "60c0cf977a34c99afa7942466625aeba74969bdf", + "subject": "docs: clarify recovery for valid lookup failures", + "body": "docs: clarify recovery for valid lookup failures\n", + "parents": ["7c755f2147528151d8186278d1c739fbf455f238"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "293db94dd00e1ee084dd0fcc7a8a9e4b49f671a1", + "subject": "docs: prioritize product contracts over skill guidance", + "body": "docs: prioritize product contracts over skill guidance\n", + "parents": ["60c0cf977a34c99afa7942466625aeba74969bdf"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "71746351d322c847cb6b8bc8e1b21e80491a878e", + "subject": "fix(ci): preserve the package verifier HTTP boundary (#8483)", + "body": "fix(ci): preserve the package verifier HTTP boundary (#8483)", + "parents": ["293db94dd00e1ee084dd0fcc7a8a9e4b49f671a1"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8483] + }, + { + "sha": "1aa6beb5dc937a19e87df70b56df48f0d4e09541", + "subject": "fix(decompile): name the differing resume identity (#8465)", + "body": "fix(decompile): name the differing resume identity (#8465)\n\nResume refused every identity mismatch with one generic message and\ngeneric input-schema recovery. Report the differing target, profile,\nlayout, or provider facts with the journal and current values so callers\ncan choose the matching provider/profile or a new output directory.\n\nFixes #8349", + "parents": ["71746351d322c847cb6b8bc8e1b21e80491a878e"], + "authors": [ + { + "name": "2SinceJuly", + "email": "2929362966@qq.com", + "user": { + "login": "2SinceJuly", + "__typename": "User" + } + } + ], + "pullRequests": [8465] + }, + { + "sha": "e5e0dc5542f6a63b790881ac906dc9fcd6d46659", + "subject": "fix(ci): include hidden VitePress configuration in CodeQL (#8486)", + "body": "fix(ci): include hidden VitePress configuration in CodeQL (#8486)", + "parents": ["1aa6beb5dc937a19e87df70b56df48f0d4e09541"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8486] + }, + { + "sha": "3842809c371a59609f576a9db8f9c492a3f071e6", + "subject": "docs(setup): clarify Hopper failures and installer verification", + "body": "docs(setup): clarify Hopper failures and installer verification\n", + "parents": ["e5e0dc5542f6a63b790881ac906dc9fcd6d46659"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "53363166f068a21f00a605187e1c3af428aa7d5d", + "subject": "fix(evidence)!: validate native view parent predicates (#8451)", + "body": "fix(evidence)!: validate native view parent predicates (#8451)\n\nReject native view sources whose predicate disagrees with the selected operation. Use the original predicate for existing Evidence; do not alter a record without recomputing its identity.", + "parents": ["3842809c371a59609f576a9db8f9c492a3f071e6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8451] + }, + { + "sha": "d684125eedc75ea3ea6061d086ae9c530da198a4", + "subject": "docs(providers): verify prerequisite recovery and sibling failures", + "body": "docs(providers): verify prerequisite recovery and sibling failures\n", + "parents": ["53363166f068a21f00a605187e1c3af428aa7d5d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "bafe3784cd6fd3f46dd472a913e97f08f4d7427f", + "subject": "fix(native): report dispatch target applicability (#8400)", + "body": "fix(native): report dispatch target applicability (#8400)\n\n* fix(native): report dispatch target applicability\n\n* fix(native): clarify unavailable mode recovery\n\n* test(kuna): avoid overlapping verifier imports\n\n* docs(native): explain mode-specific discovery\n\n* fix(native): preserve unbound provider recovery", + "parents": ["d684125eedc75ea3ea6061d086ae9c530da198a4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8400] + }, + { + "sha": "32c253ba318204c8ba0d81f1dab0ce6dfd8cead9", + "subject": "fix(electron): preserve application argv during active capture (#8492)", + "body": "fix(electron): preserve application argv during active capture (#8492)", + "parents": ["bafe3784cd6fd3f46dd472a913e97f08f4d7427f"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8492] + }, + { + "sha": "aa48d494e9726d469a1b9ed917f021d8a1a4c7ea", + "subject": "fix(pe): enforce certificate name string alphabets (#8494)", + "body": "fix(pe): enforce certificate name string alphabets (#8494)\n\n* fix(pe): enforce certificate name string alphabets\n\n* test(mcp): assert structured absolute-path diagnostics\n\n* test(mcp): assert typed selector and stdio diagnostics\n\n* fix(pe): bound IA5 name scans before validation", + "parents": ["32c253ba318204c8ba0d81f1dab0ce6dfd8cead9"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8494] + }, + { + "sha": "df25bc8068b4d62c0e8db2b38648648ed831ae0e", + "subject": "fix(ghidra): retain relocation symbol observations (#8531)", + "body": "fix(ghidra): retain relocation symbol observations (#8531)\n\n* fix(ghidra): retain relocation symbol observations\n\n* test(ghidra): verify named relocation symbols through CLI\n\n* fix(ghidra): clarify verification and supervise test commands\n\n* test(ghidra): share load verification guidance", + "parents": ["aa48d494e9726d469a1b9ed917f021d8a1a4c7ea"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8531] + }, + { + "sha": "1d343a88e53af51101a408d437641c60b7bb34e4", + "subject": "feat(kuna): verify release 1.988 (#8509)", + "body": "feat(kuna): verify release 1.988 (#8509)", + "parents": ["df25bc8068b4d62c0e8db2b38648648ed831ae0e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8509] + }, + { + "sha": "3e6a5cb20ac7aa6353b80421aafb25d7ca552090", + "subject": "fix!: preserve address context input errors (#8419)", + "body": "fix!: preserve address context input errors (#8419)\n\n* fix: retain address context cleanup failures\n\n* fix!: preserve address context input errors\n\nBREAKING CHANGE: Strict clients that cached the previous full inspect_address_context output schema must refresh tools/list and accept the typed error field on unavailable facets.\n\n* test: use session contract for address context", + "parents": ["1d343a88e53af51101a408d437641c60b7bb34e4"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8419] + }, + { + "sha": "76cd23d2e87bb4361507fec40fadb2416ad0f4f9", + "subject": "fix(process): remove unused Darwin helper cache type export (#8511)", + "body": "fix(process): remove unused Darwin helper cache type export (#8511)\n\nScheduled deep static checks on main fail knip because the\nDarwinHelperCache type alias added in #8318 has no consumer. Remove\nthe alias; callers already use createDarwinHelperCache's inferred\nreturn type.\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["3e6a5cb20ac7aa6353b80421aafb25d7ca552090"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8511] + }, + { + "sha": "35ae7232bf5ddc0e26954557055f9c01fc4b8d6c", + "subject": "fix(enhanced): stop call graph traversals at unconfirmed provider cleanup (#8516)", + "body": "fix(enhanced): stop call graph traversals at unconfirmed provider cleanup (#8516)\n\n* fix(enhanced): stop call graph traversals at unconfirmed provider cleanup\n\nA relationship read whose provider could not confirm cleanup of resources it\nowns was projected into a graph node or call-path failure, the traversal kept\ndispatching queued reads, and get_call_graph / trace_call_path returned\nsuccess with the cleanup_incomplete status buried inside the result.\n\nBoth traversals now read relationships through one shared owner,\nreadCallRelationships, which classifies a cancelled read or a read with\nunconfirmed owned cleanup as terminal. On such a cleanup stop the workflow\nreturns the provider's own error as the outcome, so its cleanup owner, retry\nbinding and live resolution stay intact, and keeps the work admitted before\nthe stop as the workflow's normal result shape with a caveat naming the\nstopped procedure and the unexpanded count. The composed-workflow layer\nturns that admitted result into partial workflow Evidence on the failure,\nand the MCP adapter retains it through the shared partial-error delivery.\nOrdinary read failures still produce successful partial results.\n\nFixes #8369\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(enhanced): retain every carried partial Evidence on enhanced failures\n\nEnhanced-tool failures used the shared partial-error delivery only when this\nPR's workflow partial was attached. A failing read that already carried its\nown partial Evidence, and analyze_function dossier failures, were projected\ninline and never recorded with the session writer, so readback and bundle\nexport could not recover them. Every enhanced execution failure now goes\nthrough one delivery owner that uses toPartialErrorToolResult with the\nsession writer; it still falls back to inline when no writer or no valid\nEvidence exists.\n\nTests compare the traversal caveat against its owning formatter instead of\ncopying the sentence.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["76cd23d2e87bb4361507fec40fadb2416ad0f4f9"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8516] + }, + { + "sha": "3f61303939711680d07e6d00d021aa550c15e8d3", + "subject": "fix(session): clear provider-inferred unavailability after recovery (#8518)", + "body": "fix(session): clear provider-inferred unavailability after recovery (#8518)\n\n* fix(session): clear provider-inferred unavailability after recovery\n\nA provider adapter or process failure marked every routed operation of\nthat provider unavailable, but a later success cleared only the operation\nthat succeeded. Sibling operations, and composed tools built on them, kept\nadvertising the stale failure until each was retried individually.\n\nMove runtime availability into one owner that records whether each entry\nwas observed for the operation or inferred from another operation's\nprovider-wide failure. A success clears its own failure and that provider's\ninferred entries while keeping failures observed on other operations or\nproviders and declared refusals. Outcomes are ordered by dispatch to the\nprovider client, so an older in-flight success no longer erases a newer\nfailure while a request queued behind a failure still clears it.\n\nFixes #8404\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(session): keep newer successes when older failures complete last\n\nRuntime availability kept one merged entry per operation and forgot\nsuccessful dispatches. An older provider-wide failure that completed after\na newer success re-inferred unavailability for siblings the newer success\nhad already proved working, and a superseded refusal could survive its own\nlater success.\n\nRecord only the newest failure and newest success dispatch per operation\nand per provider, and project unavailability from them: an operation is\nunavailable while its own newest failure is newer than its own newest\nsuccess, or, as inferred, while its provider's newest provider-wide failure\nis newer than any success from that provider. The projection no longer\ndepends on reply completion order.\n\nThe recovery tests now bound held-reply acknowledgements, release and join\nevery held call in finally, and compare remediation with the owning\nformatters instead of copying their wording.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["35ae7232bf5ddc0e26954557055f9c01fc4b8d6c"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8518] + }, + { + "sha": "44b638400940d24b24b3a73add010933ca4fc9fb", + "subject": "fix(native): find procedures by the secondary names exact lookup accepts (#8520)", + "body": "fix(native): find procedures by the secondary names exact lookup accepts (#8520)\n\n* fix(native): find procedures by the secondary names exact lookup accepts\n\nsearch_procedures matched only each procedure's primary name, while exact\nlookup also accepts Kuna inventory aliases (versioned-symbol and generated\nsub_ names) and Ghidra symbols at an exact function entry. A search for a\nname procedure_address resolves returned nothing, and trace_feature\nsilently missed the procedure.\n\nBoth providers now match the same names their exact lookup accepts. A\nprocedure still appears once under its primary name; the optional\nmatched_aliases field lists the secondary names that matched, so aliases\nnever become procedures of their own and list_procedures is unchanged.\nThe shared domain helper owns that row rule for Kuna and for the Ghidra\nhost-side Unicode folding pass. The Ghidra analysis profile records the\nnew search semantics so older snapshots cannot replay alias-blind results.\n\nFixes #8330\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(ghidra): match leaf spellings of procedure names in search\n\nprocedure_address accepts each entry symbol's leaf or namespace-qualified\nspelling, but procedure search tested only qualified names, so a regex\nsuch as ^audit_alias$ missed a secondary symbol ns::audit_alias (and ^same$\nmissed a primary alpha::same) that exact lookup selects.\n\nLookup and search now share one bridge definition of the names that select\na procedure, so they cannot drift. Matching secondary symbols are still\nreported by their qualified names; because a leaf ends its qualified\nspelling, the host's Unicode literal pass stays exact over those names.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["3f61303939711680d07e6d00d021aa550c15e8d3"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8520] + }, + { + "sha": "423059a4de9669afa44d81942803083e82149dc4", + "subject": "feat(javascript): page retained feature traces through analysis views (#8522)", + "body": "feat(javascript): page retained feature traces through analysis views (#8522)\n\n* feat(javascript): page retained feature traces through analysis views\n\nA bidirectional trace_application_feature result can exceed one MCP\nresponse, and inspect_analysis_view refused trace parents as unsupported,\nso the only recovery was exporting the whole session.\n\n- Add a shared feature-trace view owner: a summary with the trace's\n identity, producer counts and coverage, and pages of paths, nodes,\n edges, seed_matches and native_handoffs in retained order with exact\n filters. Node rows are compact unless observations are requested.\n Page coverage never upgrades trace coverage.\n- Accept an optional MCP view on trace_application_feature that retains\n the complete trace before returning the selected facts; the CLI keeps\n complete JSON and reads saved traces with inspect-analysis-view.\n- Offer a ready-to-call first paths page when a retained complete trace\n exceeds the MCP response budget.\n- Share the distinct authority/state/confidence basis helper with\n module references.\n\nFixes #8296\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(javascript): name the retained parent when a selected view overflows\n\nReview follow-up for the feature-trace views.\n\n- Share one delivery owner between trace_application_feature and\n compare_source_to_bundle: stage the selected view against the\n completed parent, keep the established contract that a cancelled\n request commits no session facts, then commit sources and the parent.\n- A selected view that exceeds the response budget now references the\n retained parent and offers the same selection at half its limit,\n instead of naming the view record, which cannot be a view parent.\n- Cover two native handoffs paged one at a time, the oversized selected\n page, and cancellation after the trace completes.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(javascript): bind feature-trace pages to their collection rows\n\nAdvertise each feature-trace page with exactly its own row schema, so a\npaths page cannot validate with node, edge, seed-match or handoff rows.\nThe native-trace view in #8533 received the same review finding; the two\nsibling views now share one strict page contract.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(javascript): mix valid rows from another collection into a trace page\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["44b638400940d24b24b3a73add010933ca4fc9fb"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8522] + }, + { + "sha": "4b840aa1fb9d07e93220c3feb58919c1d846048a", + "subject": "fix(setup): report the failed Hopper request URL and HTTP status (#8526)", + "body": "fix(setup): report the failed Hopper request URL and HTTP status (#8526)\n\n* fix(setup): report the failed Hopper request URL and HTTP status\n\nHopper download callers collapsed every transport failure into a bare\n`ok: false`, so HTTP 404 and 503 from the macOS feed and DMG, the Linux\npublisher feed, the public key and the launch-time package download produced\nidentical generic advice without the failed URL.\n\nThe shared downloader now returns a typed failure (url plus http_status,\ntimeout, network, response_too_large or url_refused) and keeps caller\ncancellation as a rejection. Installers attribute it to the request\n(release_feed, package or public_key); HopperReleaseError carries it, and\nsetup projects it once into `download` and a remediation naming the URL,\noutcome and next step. Replaces the Linux-only \"Package download returned\nHTTP\" special case.\n\nFixes #8503\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(setup): refuse credentialed Hopper URLs and keep known HTTP outcomes\n\nNative Fetch rejects a URL with userinfo using a TypeError that echoes the\nwhole URL, so a credentialed redirect reached `download.detail`, setup\nremediation and publisher messages as a network failure. The downloader now\nrefuses request and redirect URLs carrying credentials as\n`url_refused: credentials` before requesting them, and reports the caller URL\nthrough the shared userinfo-removing `sanitizeBrowserUrl`.\n\nReleasing an unadmitted body no longer replaces the outcome it was released\nfor: an errored (truncated) body after HTTP 503, or a failed cancel at the\nsize limit, keeps `http_status` or `response_too_large`.\n\nTests compare delivered remediation with the owning formatters and assert\nrequest, URL, status and recovery class independently.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["423059a4de9669afa44d81942803083e82149dc4"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8526] + }, + { + "sha": "eb39a07966168ae61685cc8b5cf798c8fc6f9436", + "subject": "feat(evidence): read selected complete records without the whole bundle (#8528)", + "body": "feat(evidence): read selected complete records without the whole bundle (#8528)\n\n* feat(evidence): read selected complete records without the whole bundle\n\nget_evidence_bundle could discover a record by exact ID, but reading it\nrequired the complete canonical bundle: complete + filters was rejected,\nand inspect_analysis_view refuses parents without a view, such as\nannotations, pseudocode sources and native traces.\n\n- Add detail: records, a page (offset, limit; default 0, 8) of the\n complete matching records in canonical bundle order. Records keep their\n original IDs, subjects, providers and readback; missing_evidence_links\n names direct links of the returned records that are not retained.\n- The selection is labelled as historical and not an importable bundle;\n complete keeps returning the canonical bundle, and offset/limit\n require detail: records.\n- Filters keep one owner shared by summary and records delivery, for the\n MCP session and the CLI's inspect-evidence-bundle.\n- An oversized record page now advises a smaller limit or one\n evidence_id; whole-bundle overflow guidance mentions record reads.\n\nFixes #8307\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(evidence): compare record-selection guidance with its owners\n\nAssert the record-selection limitations and oversized-page guidance\nagainst their owning constants, and check the reported limit facts\nseparately, instead of pinning explanatory phrases.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["4b840aa1fb9d07e93220c3feb58919c1d846048a"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8528] + }, + { + "sha": "cbc69537cdf54dca6cc1cfada4ed8a5f1d9633df", + "subject": "fix(discovery): carry provider repair instructions into capability discovery (#8532)", + "body": "fix(discovery): carry provider repair instructions into capability discovery (#8532)\n\n* fix(discovery): carry provider repair instructions into capability discovery\n\nProvider readiness reported only a failure description, so capability\ndiscovery copied that description into tool_availability remediation and\ndropped repairs the owners already had: the JEB discovery-deadline setting,\nthe ADB/Apktool execute-permission repair kept in diagnostics, and the IDA\nand Kuna configuration recovery.\n\nUnavailable ProviderAvailability now requires the owner's remediation\nnext to its reason, and readiness-derived unavailable capability\ndescriptors carry it too. Every producer supplies it (ADB, Apktool, JADX,\nJEB, Ghidra, Hopper, IDA, Kuna, pcap, owned-process prerequisites, profile\nrejection); the inventory uses it verbatim, falling back to the reason\nonly for static capability facts that declare no repair. ADB/Apktool\nconfiguration failures own remediation as a field instead of diagnostics,\nand execution refusals project it as remediation.action. JADX doctor reads\nthe availability's remediation instead of re-deriving it.\n\nbinary_session complete candidate availability and unavailable capability\ngroups expose remediation (CLI capabilities/providers too); summary omits\nit and lists it in omitted_fields. The superseded IDA\nconfiguration_remediation and windows_native_failure.remediation\ndiagnostics are removed.\n\nFixes #8506\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(discovery): keep owner repairs through provider selection and capability maps\n\nAddress review findings on the readiness-remediation contract:\n\n- Provider selection rejections carry the availability owner's\n remediation, CLI/MCP error details project it, and an explicit\n selection refused by readiness uses it as remediation.action. IDA's\n unreadable registration and Ghidra's Windows readiness repair no\n longer degrade to generic selection advice now that the diagnostics\n copies are gone.\n- Ghidra's Windows readiness and existing-project capability maps carry\n the same repair as the availability.\n- pcap readiness keeps the limiter owner's repair (now a typed\n remediationAction) and falls back to Wireshark guidance only when the\n failure has none.\n- ADB/Apktool repairs are owner constants that are complete sentences.\n The execution refusal keeps its previous message-plus-repair recovery,\n which the compiled CLI contract asserts.\n- Regression tests compare with the owning formatter or constant and\n add public MCP and CLI coverage for an explicit IDA selection.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["eb39a07966168ae61685cc8b5cf798c8fc6f9436"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8532] + }, + { + "sha": "85013da0cec7b854f51e47de77fd24391c8fd8ed", + "subject": "fix(cli): describe one-shot timeouts for an invocation whose session has ended (#8535)", + "body": "fix(cli): describe one-shot timeouts for an invocation whose session has ended (#8535)\n\n* fix(cli): describe one-shot timeouts for an invocation whose session has ended\n\nA one-shot CLI analysis that reached a provider deadline told its caller\nthat the Ghidra session remained usable and reported a runtime-editable\nlimit applying to the next operation, although the command had already\nreleased its provider session and runtime.\n\nThe shared error projection now takes an explicit caller lifetime.\nProviders keep guidance that holds only for a continuing caller (session\nreuse, same-session runtime updates) apart from the request outcome, and\nthe presentation adds it only for a continuing caller. One-shot owners\n(runDirectAnalysis, runProviderAnalysis, finishAnalysisCommand and the\nJavaScript application command) project for the invocation: details.limit\nreports scope rea-invocation, applies_at next_invocation and the launch\nenvironment seed, and the remediation leads with that setting for a new\ninvocation. MCP output keeps its runtime-update and same-session guidance.\n\nCovers the Ghidra decompile timeout, decompiler failure, regex stack\nexhaustion and startup timeout, the shared regex deadline, the Kuna\ndecompile timeout and the Hopper startup timeout.\n\nFixes #8311\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(cli): project composed child failures for the caller lifetime\n\nCleanup composition embedded its primary and cleanup failures as\ncontinuing-caller projections, and baked the primary's message and the\ncleanup's remediation into the composed error. A one-shot command whose\nGhidra startup timed out while shutdown also failed therefore still\nreported a rea-runtime limit and update_analysis_settings in\ndetails.diagnostics.primary_error.\n\nchildFailureDiagnostics now snapshots each embedded child at composition\nfor both lifetimes when its projection depends on the caller, so cleanup\nhistory keeps its composition-time state and the final projection selects\nthe caller's form. composedCallerGuidance re-attributes message and\nremediation with their continuing-only parts kept separate. Error copies\nand redaction keep the invocation diagnostics. The Hopper startup timeout\nnow carries its continuing guidance on the error like the other producers.\n\nInvocation limits keep agent_editable and rea_restart_required, with\nvalues that hold for a new invocation, so only scope and applies_at\nchange and environment is added.\n\nIn existing-project mode a decompile timeout or a cancelled session now\nsays the next session copies and opens REA_GHIDRA_PROJECT_PATH again\nrather than repeating import and analysis.\n\nTests compare delivered guidance with the owning formatters and constants\ninstead of freezing prose.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["cbc69537cdf54dca6cc1cfada4ed8a5f1d9633df"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8535] + }, + { + "sha": "46c13b9981f62373215f748928dcf099d417c026", + "subject": "fix(electron): preserve runtime rejection and exception policies (#8542)", + "body": "fix(electron): preserve runtime rejection and exception policies (#8542)\n\n* fix(electron): preserve runtime rejection and exception policies\n\n* fix(electron): retain rejection handlers for revoked proxies", + "parents": ["85013da0cec7b854f51e47de77fd24391c8fd8ed"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8542] + }, + { + "sha": "ce9095d727c5ca32513f0e1c915e7cbf540e28f0", + "subject": "fix(test): contain browser fixture HTTP request targets (#8566)", + "body": "fix(test): contain browser fixture HTTP request targets (#8566)", + "parents": ["46c13b9981f62373215f748928dcf099d417c026"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8566] + }, + { + "sha": "7bcefead69bf97b45225f8cfc1ce57ce9e6903ec", + "subject": "test: strengthen and prune audited test coverage (#8573)", + "body": "test: strengthen and prune audited test coverage (#8573)\n\n* test: strengthen and prune audited test coverage\n\n* test: require delivered DeepSeek skill instructions\n\n* test: keep schema fixture types private\n\n* test: verify Gemini receives skill instructions\n\n* test: bind Qwen skill evidence to its tool result\n\n* test: report NativeAOT verifier checks precisely\n\n* fix: verify Ghidra cleanup paths reliably\n\n* fix: verify Command Code skill activation\n\n* test: tighten cleanup and fixture checks\n\n* test: verify packet capture evidence is recorded\n\n* fix: report HTTP3 capture provenance accurately\n\n* test: preserve resource coverage through MCP\n\n* test: prune repeated assertions and retain cancellation identity\n\n* fix: validate client verifier fixture paths\n\n* test: skip Copilot verifier cases on Windows\n\n* test: keep verifier setup target relative", + "parents": ["ce9095d727c5ca32513f0e1c915e7cbf540e28f0"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8573] + }, + { + "sha": "0354145a2ad9844f87b602bd457ae3df9982e0d3", + "subject": "docs: clarify test audits and organize verification lanes", + "body": "docs: clarify test audits and organize verification lanes\n", + "parents": ["7bcefead69bf97b45225f8cfc1ce57ce9e6903ec"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6d60db19510896559214094cecfcc262b76e8a33", + "subject": "fix(test): restrict storage fixture to loopback (#8582)", + "body": "fix(test): restrict storage fixture to loopback (#8582)", + "parents": ["0354145a2ad9844f87b602bd457ae3df9982e0d3"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8582] + }, + { + "sha": "d3ab0faf52a02ff5a618f3ed7beb608b78752abd", + "subject": "refactor(ci): parse readiness fences with a static expression (#8586)", + "body": "refactor(ci): parse readiness fences with a static expression (#8586)", + "parents": ["6d60db19510896559214094cecfcc262b76e8a33"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8586] + }, + { + "sha": "00c4f44a1c002f9801ee535386be60c30b23d20e", + "subject": "fix(ci): repair verifier fixtures and formatting failures", + "body": "fix(ci): repair verifier fixtures and formatting failures\n", + "parents": ["d3ab0faf52a02ff5a618f3ed7beb608b78752abd"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "8250bf2320ea57aab4e664db4b4d44b8abd2004e", + "subject": "perf(test): bind deferred runtime calls to advertised schemas (#8622)", + "body": "perf(test): bind deferred runtime calls to advertised schemas (#8622)", + "parents": ["00c4f44a1c002f9801ee535386be60c30b23d20e"], + "authors": [ + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [8622] + }, + { + "sha": "f95bdbce76fa538d9383a36c7dde0468078b42f4", + "subject": "fix(native): stop value traces at unconfirmed child cleanup (#8576)", + "body": "fix(native): stop value traces at unconfirmed child cleanup (#8576)\n\nAfter a validated seed, trace_native_values turned a cleanup-incomplete\nfailure from a call-target read or a followed callee dossier into a\nplain-text unknown, kept dispatching reads, and returned successful\nEvidence without the cleanup_incomplete status, cleanup reason or owned\nresources.\n\nThe trace now classifies child failures with the shared stopsTraversal\npredicate that call graph traversals use. A cancelled child still ends\nthe trace with its cancellation. A child whose provider cannot confirm\ncleanup stops the trace: the provider's own error is the outcome, so its\nresources and bound cleanup retry stay intact, and the work admitted\nbefore the stop is returned as the trace's normal shape, with traversal\ntruncated by cleanup_incomplete and a located unknown at the stopping\nread. That stop stays primary over a concurrent caller abort and over\nthe output-size check. Ordinary child failures remain unknowns.\n\nMCP already retains such partials as workflow Evidence. The one-shot CLI\ndropped them, so runDirectAnalysis now retains the partial workflow\nEvidence on the failure through the same shared owner.\n\nFixes #8371\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["8250bf2320ea57aab4e664db4b4d44b8abd2004e"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8576] + }, + { + "sha": "20a282a1813f45d66f4ab2e76880a8eebba0f9bc", + "subject": "fix(javascript): report SVG script references and skipped bodies (#8627)", + "body": "fix(javascript): report SVG script references and skipped bodies (#8627)\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>", + "parents": ["f95bdbce76fa538d9383a36c7dde0468078b42f4"], + "authors": [ + { + "name": "hhang", + "email": "17309584214@163.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + } + ], + "pullRequests": [8627] + }, + { + "sha": "0e6943c9da463d0a9ea725d905cfa39ffe06896b", + "subject": "fix(session): guide retained cleanup before reopening targets (#8628)", + "body": "fix(session): guide retained cleanup before reopening targets (#8628)\n\n* fix(session): guide retained cleanup before reopening targets\n\n* test(cli): isolate worker completion deadline from startup\n\n---------\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>", + "parents": ["20a282a1813f45d66f4ab2e76880a8eebba0f9bc"], + "authors": [ + { + "name": "hhang", + "email": "17309584214@163.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + } + ], + "pullRequests": [8628] + }, + { + "sha": "dec8d2d58898c71abb17a37c338935f32bd14210", + "subject": "feat(native): select retained batch decompile results through analysis views (#8629)", + "body": "feat(native): select retained batch decompile results through analysis views (#8629)\n\n* feat(native): select retained batch decompile results through analysis views\n\nA completed batch_decompile could only be read whole. When it did not fit the\nMCP response budget, or an agent wanted one function, inspect_analysis_view\nrefused the parent as unsupported and the only recovery was exporting the\nsession.\n\n- Own the batch result schema in the domain, replacing the contract's copy and\n the workflow's hand-written item types.\n- Add summary and batch-decompile views: body-free rows keyed by original index\n with exact filters and opt-in bodies, and UTF-16 pages of one body.\n- Report the decompiling provider from the upstream analysis profile, since the\n Evidence provider is the composing workflow.\n- Keep batch limitations visibly aggregated rather than attributing them to one\n successful item.\n\nFixes #8498\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): count every unavailable entry label in a batch summary\n\nlabel_unavailable only counted failed lookups, so a batch whose provider\nanswered null for every label reported zero. The identity contract defines a\nnull name as an unavailable label in both cases.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(native): require advertised batch schemas through the shared validator\n\nA local validator map dropped any tool without an output schema, so removing an\nadvertised schema would have left these contract tests green. Require both named\nschemas and validate through createMcpSchemaValidation, as docs/testing.md asks.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["0e6943c9da463d0a9ea725d905cfa39ffe06896b"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8629] + }, + { + "sha": "aba56df689380f5bcd66e4858b778ba1e3115e90", + "subject": "fix(ghidra): reject uncommitted handshake reports before the first query (#8630)", + "body": "fix(ghidra): reject uncommitted handshake reports before the first query (#8630)\n\nThe handshake check ran only inside startSession, which a query reached\nonly when the profile committed a startup input, for PE or for an existing\nproject. Any other session started lazily inside callTool, so analysis seeds,\ndisabled analyzers, extension results, MIPS soft-float storage or a RISC-V\ncalling convention that the profile did not commit were never checked and\nthe query returned its result.\n\nEvery query now runs the checked start first. The client shares one startup\nattempt, so there is still one launch, and a provider restarted within the\nsession is checked again. That leaves startSession as the only start in the\nprovider client, so the PE data-type path reuses its session info.\n\nRecovery guidance is unchanged: the former eager-start condition now selects\nonly whether a completed handshake counts as a running provider.\n\nFixes #8612\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["dec8d2d58898c71abb17a37c338935f32bd14210"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8630] + }, + { + "sha": "365c3245e847e208e234458c3ebff6195374a74d", + "subject": "fix(setup): refuse Hopper on macOS below the release's minimum (#8548)", + "body": "fix(setup): refuse Hopper on macOS below the release's minimum (#8548)\n\n* fix(setup): refuse Hopper on macOS below the release's minimum\n\nHopper setup planning accepted any macOS 12+ host as supported, and the\ninstaller never compared the host with the selected release. The current\npublisher-signed Hopper 6.6.1-demo requires macOS 12.4 (feed\ndeployment_target and the app's LSMinimumSystemVersion), so setup on\n12.0-12.3 installed an app the host cannot run.\n\nThe installer now takes the minimum from the release that owns it: the\nfeed's deployment_target before the package download, and the signed\napp's LSMinimumSystemVersion (decoded in-process after signature\nverification) before copying. A host below either fails with the new\nincompatible_host_version code and an installer detail naming both\nversions; an incomparable app value is a bundle failure. Planning keeps\nREA's own macOS 12 floor but reports support as unknown, since the\nrelease minimum is read only after approval, and the plan discloses the\ncheck. Info.plist decoding is shared with app-bundle resolution.\n\nFixes #8502\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(setup): compare the macOS Hopper plan detail with its owning disclosure\n\nThe planning test froze an explanatory sentence from the setup plan. The\nmacOS install detail now lives in macHopperInstallDisclosure beside the\ncommands and origins the installer owns, the plan uses it, and the test\ncompares the plan with that constant while keeping its independent\nsupport-state assertions. An installer test also pins that the signed\napp's requirement is read only after both signature checks pass.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(setup): compare macOS Hopper refusal details with their owners\n\nThe installer's refusal details were template literals inside\ninstallMacHopper, so tests copied whole sentences. The installer now\nformats them through exported macHopperHostVersionDetail and\nmacHopperIncomparableMinimumDetail. Tests compare each diagnostic and the\nsetup remediation with those owners and SetupInstallFailure's recovery,\nand separately assert the URL, versions, setting name, failure code and\nrequest order. The Info.plist type refusal is checked by error type, key\nand path instead of a sentence fragment.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["aba56df689380f5bcd66e4858b778ba1e3115e90"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8548] + }, + { + "sha": "2ac6d3efe2d1a37176da3bc811156b37abe51619", + "subject": "fix(process): re-read unreadable tokens before signaling and name the process (#8553)", + "body": "fix(process): re-read unreadable tokens before signaling and name the process (#8553)\n\n* fix(process): re-read unreadable tokens before signaling and name the process\n\nDarwin KERN_PROCARGS2 samples a process's argument length and stack top\nbefore it reads the address space, and exec publishes the new length\nbefore it copies the new strings out (xnu sysctl_procargsx,\nexec_copyout_strings). A read during exec can return a zero-filled or\nstale strings area, and exec keeps the PID and start time that bracket\nthe read. The final sweep already re-read such tokens, but the\npre-signal group check read each member's token once, so one transient\nread of a live group member failed the whole cleanup.\n\nMove the bounded re-read into one shared fact-reading helper and use it\nfor both the sweep and the pre-signal group check. The group check binds\nre-reads to the generation it first observed, so a reused PID stays\nunresolved; the sweep keeps classifying the PID's current process.\n\nAn unreadable-token failure now carries the native identity read after\nthe token and the summary names the candidate by its native name,\nparent, group and start identity. The Darwin helper and Linux procfs\nreader report the short native process name (p_comm/comm) for display.\n\nFixes #8337\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(process): refresh other pre-signal members after token re-read waits\n\nThe pre-signal group check re-read only members whose token was\nunavailable, so a readable member kept the relation it had before the\nretry waits. A member that moved to another process group during those\nwaits could be validated on its old group, and the old group signaled\nwhile the moved member kept running.\n\nAfter any retry wait, the shared re-read helper now reads every other\nlive pre-signal fact once more with the same generation binding. A moved\nmember then takes the existing changed-group path, which retains its\nownership evidence and fails cleanup. An inconclusive refresh replaces\nthe stale fact so it fails closed. Nothing changes when no re-read ran,\nand the sweep keeps classifying current processes because every group\nit finds is revalidated before signaling.\n\nAlso cover PID reuse that happens before the re-read starts, where both\nre-read identities agree and only the first-read generation rejects the\nreplacement's token.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(process): keep known identity changes final across token re-reads\n\nThe pre-signal re-read treated a first read without a same-generation\nidentity as unbound and replaced it with the re-read. On Linux the first\nread can already establish PID reuse (an ESRCH token whose exit check sees\nanother generation); the re-read then classified the replacement, so a\nzombie replacement could let cleanup succeed.\n\nA pre-signal check now re-reads only same-generation facts. Changed,\nexited, exiting and foreign-token facts are final. Each attempt also\nre-reads the group's owned members instead of one separate refresh after\nthe loop, so a member that moves groups or turns unreadable while another\nwaits is seen within the same bound. The caller's run token selects the\nowned members, and the sweep keeps classifying current processes.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["365c3245e847e208e234458c3ebff6195374a74d"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8553] + }, + { + "sha": "59f5502a40cf4dae4d88b439890f58717ed6199e", + "subject": "fix(javascript): emit no event operation for a literal non-function listener (#8621)", + "body": "fix(javascript): emit no event operation for a literal non-function listener (#8621)\n\n* fix(javascript): emit no event operation for a literal non-function listener\n\n`EventEmitter` validates a listener before registering or removing anything:\n\n if (typeof listener !== 'function')\n throw new ERR_INVALID_ARG_TYPE('listener', 'function', listener);\n\nThe throw is synchronous, before any listener exists, but the analysis reported a\n`register` or `remove` operation for those calls.\n\nMeasured on Node 24.22.1:\n\n emitter.on(1) -> THREW ERR_INVALID_ARG_TYPE\n emitter.on(\"x\", 1) -> THREW ERR_INVALID_ARG_TYPE\n emitter.on(\"x\", null) -> THREW ERR_INVALID_ARG_TYPE\n emitter.on(\"x\", true) -> THREW ERR_INVALID_ARG_TYPE\n emitter.on(\"x\", {}) / ([]) -> THREW ERR_INVALID_ARG_TYPE\n emitter.once / addListener / prependListener / prependOnceListener /\n off / removeListener with a literal -> THREW ERR_INVALID_ARG_TYPE\n --- accepted ---\n emitter.on(\"x\", () => {}) -> ok\n emitter.on(\"x\", function () {}) -> ok\n\n`rejectsEventListener` drops the operation only for an exactly readable literal\nthat cannot be a function. An identifier, a call result or a spread may still\nsupply a function and keeps its operation, and a class expression passes Node's\nown `typeof` check.\n\n`emit` and `removeAllListeners` are untouched: `emit` passes its remaining\narguments as data to listeners that already exist, and `removeAllListeners` takes\nonly an optional event name.\n\n* fix(javascript): price a non-finite listener and keep a shifted spread\n\nTwo review findings on the event-listener guard.\n\n**A non-finite numeric literal was missed.** Babel stores `1e999` as a\n`NumericLiteral` holding `Infinity`, and the exact-value reader refuses to price a\nnon-finite number, so the guard never saw it:\n\n e.on(\"x\", 1e999) -> THREW ERR_INVALID_ARG_TYPE\n\nA numeric literal is always a number and therefore never callable, so the guard now\ndecides on the literal node directly.\n\n**A leading spread shifts the listener position.** `e.on(...args, 1)` does not pass\n`1` as the listener: Node spreads the array and ignores the trailing argument once\nthe listener is satisfied. The guard read `arguments[1]` regardless, so it dropped a\nreal registration. It now leaves the position undecided when argument 0 is a spread.\n\nFive regressions cover both forms; all five fail without the fixes.", + "parents": ["2ac6d3efe2d1a37176da3bc811156b37abe51619"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8621] + }, + { + "sha": "8b89eee76751417b8c2441414750da5027b4775d", + "subject": "fix(native): retain ELF dynamic symbol visibility in export evidence and views (#8617)", + "body": "fix(native): retain ELF dynamic symbol visibility in export evidence and views (#8617)\n\nPreserve the dynamic symbol's visibility attribute (default or protected) when extracting ELF dynamic exports, and expose it across complete Evidence and projected analysis views.\n\nHistorical Evidence records lacking visibility normalize safely to 'unknown', and projected views omitting visibility do not inject default values into partial row projections.\n\nFixes #8517", + "parents": ["59f5502a40cf4dae4d88b439890f58717ed6199e"], + "authors": [ + { + "name": "highmachs", + "email": "samarjeeth06@gmail.com", + "user": null + } + ], + "pullRequests": [] + }, + { + "sha": "3f4aff2f22a2b64b4f54c8a5b76f367f1c864696", + "subject": "fix(cli): keep captured source Evidence when one-shot delivery never commits (#8632)", + "body": "fix(cli): keep captured source Evidence when one-shot delivery never commits (#8632)\n\n* fix(cli): keep captured source Evidence when one-shot delivery never commits\n\nA completed observation that was cancelled at final close, failed cleanup, or\nnever reached bundle commit returned its evidence links but dropped the source\nrecords the invocation had already captured. The caller could neither read those\nrecords nor tell whether they were missing, captured or written.\n\nReport the closure at publishCliAnalysisEvidence, the shared boundary every\n--evidence_output command uses. details.source_closure carries authentic captured\nrecords within 64 KiB and explicit omissions: not_captured for a link this\ninvocation holds no record for, and not_inlined for a captured record outside this\nresponse. A committed bundle keeps its receipt instead, nothing is written after\ncancellation, and successful delivery is unchanged.\n\nFixes #8589\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(cli): keep the typed failure when collecting source closure cannot finish\n\nA captured source with a data-sized evidence_links array made\npending.push(...links) exceed V8's call-argument limit. On final-close\ncancellation or a refused publication that RangeError replaced the original typed\nfailure, which is the one outcome this delivery step exists to preserve.\n\nWalk the closure through a Set, which is a deduplicating breadth-first queue, so\nno link becomes a call argument and each link costs one lookup however often it\nrepeats. undeliveredSourceClosure now owns authentication and never throws: if\nexamining the closure fails, it reports collection_failure with the bounded error\ntype and an unknown closure state, and the original failure is still returned.\n\nFault the final-close tests on the scope the command gave to matching, after\nmatching completed, and assert that close was reached, so a moved close fails\ninstead of passing on an earlier one.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["8b89eee76751417b8c2441414750da5027b4775d"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8632] + }, + { + "sha": "93b8b82db70279e40f484114cff9dc1958dc14ee", + "subject": "feat(native): deliver batch decompile as a retained summary (#8631)", + "body": "feat(native): deliver batch decompile as a retained summary (#8631)\n\n* feat(native): select retained batch decompile results through analysis views\n\nA completed batch_decompile could only be read whole. When it did not fit the\nMCP response budget, or an agent wanted one function, inspect_analysis_view\nrefused the parent as unsupported and the only recovery was exporting the\nsession.\n\n- Own the batch result schema in the domain, replacing the contract's copy and\n the workflow's hand-written item types.\n- Add summary and batch-decompile views: body-free rows keyed by original index\n with exact filters and opt-in bodies, and UTF-16 pages of one body.\n- Report the decompiling provider from the upstream analysis profile, since the\n Evidence provider is the composing workflow.\n- Keep batch limitations visibly aggregated rather than attributing them to one\n successful item.\n\nFixes #8498\n\nCo-Authored-By: Claude Opus 5.5 \n\n* feat(native): deliver batch decompile as a retained summary\n\nA batch that fits still floods the caller's context with every body, and one\nthat does not fit only named an export. Selecting a body that cannot fit named\nan export too, even though its text pages can.\n\n- Accept detail: summary on batch_decompile: retain the complete batch first and\n return its counts, identities and sizes. The default stays complete, and the\n selection never reaches the Evidence parameters.\n- Offer a ready-to-call body-free first page when a complete batch overflows.\n- When a selected batch page overflows, continue from the same retained parent\n with fewer rows, then with one body's text pages.\n\nRefs #8498\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): count every unavailable entry label in a batch summary\n\nlabel_unavailable only counted failed lookups, so a batch whose provider\nanswered null for every label reported zero. The identity contract defines a\nnull name as an unavailable label in both cases.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): continue an oversized batch view from the caller's own source\n\nA batch view read from an Evidence file or inline record advertised a\nretained-evidence continuation for a parent the session never retained, so\nfollowing it failed. A view's continuation now repeats the caller's source and\nonly narrows the selection. An inline record offers none, because it cannot be\nrepeated within the reply it overflowed. Non-batch views skip the selection\nparse, since delivery asks about every view it returns.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(native): require advertised batch schemas through the shared validator\n\nA local validator map dropped any tool without an output schema, so removing an\nadvertised schema would have left these contract tests green. Require both named\nschemas and validate through createMcpSchemaValidation, as docs/testing.md asks.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): offer file view continuations on servers that retain nothing\n\nA fixed-target server reads an Evidence file through inspect_analysis_view but\nrecords nothing, so its overflow skipped the continuation and returned generic\nCLI guidance. A view's continuation names the caller's source and needs no\nsession, so it no longer depends on recording. Retained references still do.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["3f4aff2f22a2b64b4f54c8a5b76f367f1c864696"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8631] + }, + { + "sha": "710fad8acfff7d6d34a72ba3ceb02db84ee01a1d", + "subject": "feat(evidence): discover missing Evidence links without transferring records (#8633)", + "body": "feat(evidence): discover missing Evidence links without transferring records (#8633)\n\n* feat(evidence): discover missing Evidence links without transferring records\n\nAn agent could only learn that a retained record's source was absent by reading\ncomplete records or by having a downstream analysis refuse. The summary said\nnothing about links, and complete-record retention was easy to mistake for\nsource closure.\n\n- Add detail: links to get_evidence_bundle and CLI inspect-evidence-bundle:\n paged link rows with retained or missing status and no record payloads, for\n selected records against the whole session or file.\n- Add retained-closure traversal, the walk composed workflows require, reporting\n complete or incomplete. Direct reads make no closure claim.\n- Count direct and missing direct links in the summary.\n\nFixes #8454\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(evidence): count a repeated Evidence link once in every delivery\n\nThe Evidence schema does not deduplicate evidence_links, so the summary counted\na repeated link twice while link rows and counts reported it once. Both now read\none helper for a record's distinct direct links.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(evidence): validate link delivery against the advertised schemas\n\nThe test never called tools/list, so neither the shared validator nor the MCP\nclient checked its replies against what each profile advertises. A schema that\nrejected the links result could have passed. Fetch the advertised definition and\nvalidate every request and reply against it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["93b8b82db70279e40f484114cff9dc1958dc14ee"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8633] + }, + { + "sha": "6a0ccf7eeb4768a43560f63e723f0154881285ed", + "subject": "fix(doctor): report provider settings a client registration does not record (#8645)", + "body": "fix(doctor): report provider settings a client registration does not record (#8645)\n\n* fix(doctor): report provider settings a client registration does not record\n\nProvider checks read the terminal running doctor, so a registration with no\nenv block looked ready while its server reported not_configured. Compare what\nan available provider relied on with the registration's own file and report the\nsetting names in a non-blocking registration_environment check. The client's\neffective environment stays unknown, so health and the exit status are unchanged.\n\nFixes #8202\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(doctor): write the Cordis fixture at its literal path\n\nThe test resolved the path through supportedClients, whose default environment\nargument CodeQL traces to the fixture's writes even though the test passes {}.\nIt only needed the path, so spell it like the other fixtures in this file and\ndrop a leftover directory it never used.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["710fad8acfff7d6d34a72ba3ceb02db84ee01a1d"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8645] + }, + { + "sha": "4a01211f1142b4d20d155e9934e9fc5232c21e37", + "subject": "fix(javascript): keep static facts after semantic results use the parent budget (#8648)", + "body": "fix(javascript): keep static facts after semantic results use the parent budget (#8648)\n\nStatic checkpoints were admitted against the same budget as semantic and\napplication results, half of the parent's free heap. Once those charges used\nit, the next checkpoint stopped the analysis and every remaining source lost\nits static facts, with most of the parent heap still free.\n\nSemantic and application results still stop at that budget. Static checkpoints\nmay now continue to three quarters of the free heap while the live heap also\nhas room for another copy of what it holds. Without that room, admission falls\nback to the result budget. The live condition is needed because the limit V8\nreports counts young-generation capacity that retained objects cannot use:\nwithout it, the parent aborted on heap exhaustion at small heap limits.\n\nReserved relationships are given up only when the larger share runs short. A\nstop still fails with a typed error, which now reports the limit that applied,\nwhat was available, the live heap in use and what the checkpoint needed.\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["6a0ccf7eeb4768a43560f63e723f0154881285ed"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8648] + }, + { + "sha": "144843ccc26bd372d61b8c6a27b37a01a5b0fb61", + "subject": "fix(debugger): let REA exit when a debugger could not be stopped (#8652)", + "body": "fix(debugger): let REA exit when a debugger could not be stopped (#8652)\n\n* fix(debugger): let REA exit when a debugger could not be stopped\n\n`rea debug-with-gdb` and `rea debug-with-rizin` printed cleanup_incomplete\nand set exit status 1, but the retained child and its pipes kept the event\nloop alive, so the process never exited. A stdio MCP server whose client\ndisconnected hung the same way.\n\ncloseOwnedDebuggerSessions is the owner both managers finish through. It now\nunreferences retained sessions, as supervised providers already do after\nincomplete cleanup, restores the references on retry, and names the retained\nprocess IDs. The one-shot commands report those IDs, since no later command\ncan retry. Debugger ownership, signals and detach behavior are unchanged.\n\nGDB cleanup requests also no longer hold the host until their 120 s command\ndeadline, because cleanup already bounds its own wait.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(debugger): name retained debuggers when an MCP server shuts down\n\nAn MCP server that exits with a retained debugger logged only \"REA provider\ncleanup failed\" and \"could not close cleanly\", so nothing named the process\nleft for the caller to check. The PIDs were on OwnedDebuggerCleanupError, but\neach shutdown reporter read only the outer aggregate's message, and the debug\nfailure_cause description dropped the field too.\n\nThe failure type now lives in its own dependency-free module with one reader\nthat walks composed failures. The shutdown report, the server's onclose log,\nthe debug description and the one-shot CLI all use it, and the shutdown report\nwrites the same remediation the CLI returns.\n\nThe fake debuggers now model each request exactly, with real reply shapes, and\na request they do not model fails the test.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(debugger): compare retained-debugger guidance with its formatter\n\nThe new checks froze the wording \"Check process ... and its target\".\ndocs/testing.md asks guidance checks to compare with the owning formatter,\nalongside independent checks of the facts. They now do, and each still proves\nthe process ID is named, because a formatter comparison alone would pass if the\nformatter dropped it.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["4a01211f1142b4d20d155e9934e9fc5232c21e37"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8652] + }, + { + "sha": "26c3e9e4134971c79e822bbcb16fb42bb7dd8e8d", + "subject": "fix(native): select off-screen windows so the UI lane can complete (#8654)", + "body": "fix(native): select off-screen windows so the UI lane can complete (#8654)\n\n* fix(native): stop calling an off-screen window absent\n\nThe native UI helper looked up its selected window with\n`.optionIncludingWindow`, which returned nothing while that window was off\nscreen. An existing window owned by the selected process was reported as\n`window-mismatch`, before any permission check, so the verifier could not reach\nits permission boundary. Select from all windows instead; absent and foreign\nwindows still fail.\n\nThe verifier's changed-bytes check also read `error.message`, but since\ncc90771af a selection failure carries its helper code in `error.issues`, so the\ncheck could not pass. Read the issue. Together these let the permissions lane\ncomplete on main.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(native): own UI test processes from the moment they launch\n\nThe off-screen test registered cleanup only after parsing the ready record, so a\nstartup failure left `/usr/bin/open` and its app running. The lane test killed\nonly the verifier on a timeout, leaving its launcher and detached fixture alive\nuntil they expired.\n\nRegister the off-screen owner immediately after the launch; the app inherits the\nrun token, so the sweep needs no ready record. In the lane test, every stand-in\nrecords itself and leaves on one release the test's cleanup awaits.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["144843ccc26bd372d61b8c6a27b37a01a5b0fb61"], + "authors": [ + { + "name": "Kaoru0822", + "email": "kanadekitauji@proton.me", + "user": { + "login": "kaoru0822-kitauji", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8654] + }, + { + "sha": "2cb29693c3d574c4898832047fe309ac1ad00e9d", + "subject": "fix(ci): preserve release proposal overflow notes", + "body": "fix(ci): preserve release proposal overflow notes\n", + "parents": ["26c3e9e4134971c79e822bbcb16fb42bb7dd8e8d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "3c05b4d3fef94eb91c966ecd675ff97fef3e364e", + "subject": "fix(ci): remove undeclared dependency and handle PTY chunks", + "body": "fix(ci): remove undeclared dependency and handle PTY chunks\n", + "parents": ["2cb29693c3d574c4898832047fe309ac1ad00e9d"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "75c3cab5401dd48b831c1405ff4589af84f30614", + "subject": "fix(kuna)!: separate verification policy from analysis identity (#8699)", + "body": "fix(kuna)!: separate verification policy from analysis identity (#8699)\n\n* feat(kuna): verify release 1.989\n\n* fix(kuna)!: separate verification policy from analysis identity\n\n* docs(kuna): show historical evidence recovery\n\n* test(kuna): cover verification warnings through MCP", + "parents": ["3c05b4d3fef94eb91c966ecd675ff97fef3e364e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8699] + }, + { + "sha": "55078b9f575528e451c888d8b7a85da2f188bbb7", + "subject": "feat(mcp): page retained incoming reference addresses (#8591)", + "body": "feat(mcp): page retained incoming reference addresses (#8591)", + "parents": ["75c3cab5401dd48b831c1405ff4589af84f30614"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8591] + }, + { + "sha": "920d634e835ede760831bee51baabb054924f041", + "subject": "ci: exempt designated authors from readiness declaration", + "body": "ci: exempt designated authors from readiness declaration\n", + "parents": ["55078b9f575528e451c888d8b7a85da2f188bbb7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8703] + }, + { + "sha": "e749160ab0e79b1d7555cd893e20ba574a307c8a", + "subject": "fix(mcp): qualify string byte-read guidance (#8704)", + "body": "fix(mcp): qualify string byte-read guidance (#8704)\n\n* fix(mcp): qualify string byte-read guidance\n\n* fix(mcp): avoid implying complete string references", + "parents": ["920d634e835ede760831bee51baabb054924f041"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8704] + }, + { + "sha": "9bea563e30fd255d639d6877a91109ba9ff2eb00", + "subject": "fix(kuna): qualify parallel project pseudocode (#8694)", + "body": "fix(kuna): qualify parallel project pseudocode (#8694)\n\n* fix(kuna): qualify parallel project pseudocode\n\n* test(kuna): cover parallel caveats through MCP", + "parents": ["e749160ab0e79b1d7555cd893e20ba574a307c8a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8694] + }, + { + "sha": "2d11fd92d233f65dd0f3904583e09078a5a3342c", + "subject": "fix(javascript): reconcile Node targets with entry assets (#8670)", + "body": "fix(javascript): reconcile Node targets with entry assets (#8670)\n\n* fix(javascript): reconcile Node targets with entry assets\n\n* test(inspector): read reconciled evidence payload\n\n* Update tests/boundary/inspector/javascriptRuntimeNodeTarget.test.ts\n\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>\n\n* test(inspector): read the workflow evidence payload\n\n* Update tests/boundary/inspector/javascriptRuntimeNodeTarget.test.ts\n\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>\n\n* test(javascript): restore Evidence workflow result access\n\n---------\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>\nCo-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>", + "parents": ["9bea563e30fd255d639d6877a91109ba9ff2eb00"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "greptile-apps[bot]", + "email": "165735046+greptile-apps[bot]@users.noreply.github.com", + "user": { + "login": "greptile-apps[bot]", + "__typename": "User" + } + } + ], + "pullRequests": [8670] + }, + { + "sha": "510e83eadc5251ee5cc9469b894c7895ffe36ef2", + "subject": "fix(firmware): recommend the operation-specific engine (#8668)", + "body": "fix(firmware): recommend the operation-specific engine (#8668)", + "parents": ["2d11fd92d233f65dd0f3904583e09078a5a3342c"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8668] + }, + { + "sha": "eef8f44003e6bf781baf4f885f84d03b31ea6c3a", + "subject": "feat(website): publish agent discovery and Markdown responses", + "body": "feat(website): publish agent discovery and Markdown responses\n", + "parents": ["510e83eadc5251ee5cc9469b894c7895ffe36ef2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6442ea02cbdabd8cbaa4106bdbe934ea07d0dcef", + "subject": "feat(binary-layout): admit ELF64 AArch64 and name the refused host (#8711)", + "body": "feat(binary-layout): admit ELF64 AArch64 and name the refused host (#8711)\n\n* feat(binary-layout): admit ELF64 AArch64 and name the refused host\n\ninspect_binary_layout refused every AArch64 ELF, and on a non-x64 host the\nrefusal read \"supports Linux x64 only\", which looked like a target refusal\n(#8709 ran on arm64 WSL and suspected an e_machine check).\n\nThe pwntools adapter now admits little-endian ELF64 AArch64 EXEC/DYN/REL\nobjects alongside the existing profiles, pwntools must report aarch64/64/\nlittle, and the Evidence subject names arm64. The host refusal now names the\ndetected platform/arch and says the target was not read; the host check\nitself is unchanged.\n\nverify:binary:layout cross-compiles an AArch64 executable and relocatable\nobject (never executed) and checks sections, symbols and relocations\nagainst GNU readelf, decoding ELF64 r_info as a 32-bit type under a 32-bit\nsymbol index. The real-binary-layout workflow installs the toolchain.\n\nRefs #8709\n\n* test(binary-layout): refuse RISC-V as the unsupported machine and assert the host refusal path\n\nverify:binary:layout used e_machine 183 (AArch64) as its unsupported\ntarget, which this branch now admits; use EM_RISCV (243) instead.\n\nThe unsupported-host provider test now asserts the refusal names this\nhost's platform/arch and says the target was not read, so reverting the\ndecoder to the old message fails it.", + "parents": ["eef8f44003e6bf781baf4f885f84d03b31ea6c3a"], + "authors": [ + { + "name": "JANG BYUNGKUN", + "email": "bkbkjang@gmail.com", + "user": { + "login": "8rulerstar", + "__typename": "User" + } + } + ], + "pullRequests": [8711] + }, + { + "sha": "b7911b2d30b9612969390e2d6a7bcbd7a24e67bf", + "subject": "fix(evm): explain limiter configuration and access failures (#8669)", + "body": "fix(evm): explain limiter configuration and access failures (#8669)", + "parents": ["6442ea02cbdabd8cbaa4106bdbe934ea07d0dcef"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8669] + }, + { + "sha": "22c493ad5c9d2fc9825e28ab0f6cf9fb1fdf0871", + "subject": "fix(native): preserve implementation file locations (#8667)", + "body": "fix(native): preserve implementation file locations (#8667)\n\nfix(native): keep UI handler offsets distinct from method records", + "parents": ["b7911b2d30b9612969390e2d6a7bcbd7a24e67bf"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8667] + }, + { + "sha": "79766ca96a22ee0b6e04c3681546d492702b4ae7", + "subject": "fix(website): identify all public deployment verification requests", + "body": "fix(website): identify all public deployment verification requests\n", + "parents": ["22c493ad5c9d2fc9825e28ab0f6cf9fb1fdf0871"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6259ac41a48cd79dc0b7815970ba00283dde5a48", + "subject": "fix(mcp): guide target recovery for scoped tools (#8659)", + "body": "fix(mcp): guide target recovery for scoped tools (#8659)\n\n* fix(mcp): guide target recovery for scoped tools\n\n* test(mcp): cover unscoped target recovery\n\n* fix(mcp): warn before scoped session restart\n\n* refactor(mcp): own scoped target recovery guidance\n\n* fix(mcp): include unknown history in restart guidance", + "parents": ["79766ca96a22ee0b6e04c3681546d492702b4ae7"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8659] + }, + { + "sha": "d496d803a4f50dc82248db0630042894c1136d00", + "subject": "fix(kuna): give actionable lookup recovery (#8656)", + "body": "fix(kuna): give actionable lookup recovery (#8656)\n\n* fix(kuna): give actionable lookup recovery\n\n* fix(kuna): keep lookup advice operation neutral\n\n* style(kuna): apply repository formatter", + "parents": ["6259ac41a48cd79dc0b7815970ba00283dde5a48"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8656] + }, + { + "sha": "193e01abb15917cb4d1ac0f630645f526c02754c", + "subject": "fix(kuna): keep timeout recovery from changing workers (#8687)", + "body": "fix(kuna): keep timeout recovery from changing workers (#8687)\n\n* fix(kuna): keep timeout recovery from changing workers\n\n* test(kuna): verify timeout recovery with real provider", + "parents": ["d496d803a4f50dc82248db0630042894c1136d00"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8687] + }, + { + "sha": "b912ec184ca2ecbd5b59d046187be5b4a59ca3c1", + "subject": "fix(javascript): accept retained empty endpoint seeds (#6462)", + "body": "fix(javascript): accept retained empty endpoint seeds (#6462)\n\nApplication analysis preserves the complete literal request endpoint,\nincluding the empty string, and the event seed already accepts a\nretained empty name. The endpoint seed still required a non-empty\nvalue, so trace-javascript-semantics refused to select a retained \"\"\nendpoint with invalid_request.\n\nThe endpoint seed now accepts any string and keeps exact matching.\nBoundary-field seeds keep their minimum because boundary nodes are only\nproduced from method names.\n\nFound while fixing #6458; the event half of that report landed in\ncf5e4f6fa.\n\nCo-authored-by: Claude Fable 5.1 ", + "parents": ["193e01abb15917cb4d1ac0f630645f526c02754c"], + "authors": [ + { + "name": "Lewis Wang", + "email": "e1430629@u.nus.edu", + "user": { + "login": "Lew1sWong", + "__typename": "User" + } + }, + { + "name": "Claude Fable 5.1", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [6462] + }, + { + "sha": "9ebbe67e05af08b567e215340da993c08dae378f", + "subject": "fix(ci): await website worker tests and format Wrangler config", + "body": "fix(ci): await website worker tests and format Wrangler config\n", + "parents": ["b912ec184ca2ecbd5b59d046187be5b4a59ca3c1"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "d892e7861aea534bae6235407af72af9b9cdb88a", + "subject": "fix(docs): drop duplicate native-inspection guide row (#7480)", + "body": "fix(docs): drop duplicate native-inspection guide row (#7480)\n\nRemove the incomplete Choose a guide duplicate that omitted kernel-modules.md so the docs index keeps one complete native-inspection entry.\n\nFixes #7405", + "parents": ["9ebbe67e05af08b567e215340da993c08dae378f"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [7480] + }, + { + "sha": "f251009e0a30e35e881a3f3396cc9fd21d7a2259", + "subject": "fix(artifacts): report required bytes for ASAR header limits (#7452)", + "body": "fix(artifacts): report required bytes for ASAR header limits (#7452)", + "parents": ["d892e7861aea534bae6235407af72af9b9cdb88a"], + "authors": [ + { + "name": "Ha1baraA1", + "email": "243105435+Ha1baraA11@users.noreply.github.com", + "user": { + "login": "Ha1baraA11", + "__typename": "User" + } + } + ], + "pullRequests": [7452] + }, + { + "sha": "5ed283d1682ec2326ba2132168df590dcd3e6868", + "subject": "fix(har): accept Chrome DevTools bracketed IPv6 server addresses (#7225)", + "body": "fix(har): accept Chrome DevTools bracketed IPv6 server addresses (#7225)\n\nChrome DevTools HAR exports declare creator WebInspector 537.36 and\nreport IPv6 serverIPAddress values in brackets: its HAR writer strips\nthe port with lastIndexOf(':') but its bracket removal,\nreplace(/\\[\\]/g, ''), only matches the literal pair '[]'. The pinned\nschema then rejects the whole archive at the first such entry.\n\nExtend the existing Playwright 1.58.2 adaptation to this declared\nproducer. Brackets are removed only in the disposable validation copy\nand only around a valid IPv6 literal; reported spellings are retained\nand the per-entry limitation names the declared producer.", + "parents": ["f251009e0a30e35e881a3f3396cc9fd21d7a2259"], + "authors": [ + { + "name": "Jeremy Levartovsky", + "email": "140487034+JayOfTheKeyboard@users.noreply.github.com", + "user": { + "login": "JayOfTheKeyboard", + "__typename": "User" + } + } + ], + "pullRequests": [7225] + }, + { + "sha": "53fca98e3acefcd4409dd6a10c979fcf880c47b9", + "subject": "fix(setup): omit manual connectors from automatic selection (#8009)", + "body": "fix(setup): omit manual connectors from automatic selection (#8009)\n\nRetain detected manual connectors and explicit selection while excluding unsupported formats from automatic setup readiness. Fixes #7522.", + "parents": ["5ed283d1682ec2326ba2132168df590dcd3e6868"], + "authors": [ + { + "name": "Hasan Zayni", + "email": "36798269+dark13b@users.noreply.github.com", + "user": { + "login": "dark13b", + "__typename": "User" + } + } + ], + "pullRequests": [8009] + }, + { + "sha": "b3e22620a5fcd84a7ab658838f914edd1a763b24", + "subject": "fix(mcp): keep scoped doctor output parseable (#7648)", + "body": "fix(mcp): keep scoped doctor output parseable (#7648)", + "parents": ["53fca98e3acefcd4409dd6a10c979fcf880c47b9"], + "authors": [ + { + "name": "Ha1baraA1", + "email": "243105435+Ha1baraA11@users.noreply.github.com", + "user": { + "login": "Ha1baraA11", + "__typename": "User" + } + } + ], + "pullRequests": [7648] + }, + { + "sha": "4f4e2552cc97a4aa94100f1840eba7e0beb97e3c", + "subject": "fix(verification): compare retained Ghidra function evidence (#8672)", + "body": "fix(verification): compare retained Ghidra function evidence (#8672)\n\n* fix(verification): compare retained Ghidra function evidence\n\n* test(verification): require the exact missing Evidence refusal", + "parents": ["b3e22620a5fcd84a7ab658838f914edd1a763b24"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8672] + }, + { + "sha": "f59d884f35a3fd87e9b108c29c75426180feca65", + "subject": "fix(flutter): read unlabeled Dart Version::String() from engines (#7232)", + "body": "fix(flutter): read unlabeled Dart Version::String() from engines (#7232)\n\n* fix(flutter): read unlabeled Dart Version::String() from engines\n\nRelease libflutter.so embeds Dart's Version::String() without the\nstandalone VM's \"Dart VM version:\" label, so identify_flutter_build left\ndart_version null on real APKs. Accept that channel-bearing form beside\nthe labeled scanner path.\n\n* fix(flutter): qualify unlabeled version candidates\n\n---------\n\nCo-authored-by: morluto <76467478+morluto@users.noreply.github.com>", + "parents": ["4f4e2552cc97a4aa94100f1840eba7e0beb97e3c"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + }, + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [7232] + }, + { + "sha": "f5cfe09c07e6110b23301c198340014f8b8db6be", + "subject": "fix(environment): disclose truncated comparison differences (#7673)", + "body": "fix(environment): disclose truncated comparison differences (#7673)\n\nPreserve the twenty-entry diagnostic prefix and report the full count,\nomitted count and truncation fact at the owning report projection. Document\nthe recovery limitation and cover the public HAR-to-comparison workflow.\n\nFixes #7621\n\nValidation: 121 source tests; three selected CLI regressions (five other\ncases unselected); nine README conformance cases; full --noEmit typecheck;\ndocumentation facts/metadata/schema/licenses; module boundaries and\narchitecture guards. VitePress rendering is blocked by Windows EPERM on its\nworktree-local Vue symlink. Full aggregate coverage remains for Draft CI.\n\nIndependent code review: APPROVE, relayed by parent task\n01a17716-6299-75fe-87e9-b0398b8c9019. Trigger: >=50 changed lines / >=3 files.\nReviewed tree: ba964efcd6abde5a31ed019871c762d0907683dd\nReviewed full-index patch SHA256:\n972dcfc219dd7b9606175b1848068f92210fa3f7d0a8a244c1ac7ce296ae32d9", + "parents": ["f59d884f35a3fd87e9b108c29c75426180feca65"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7673] + }, + { + "sha": "e01fcfb4b2981a96ab817fe640eff35808e6153c", + "subject": "fix(reference): Exclude Git pointer files from source identities (#7667)", + "body": "fix(reference): Exclude Git pointer files from source identities (#7667)\n\n* fix(reference): Exclude Git pointer files from source identities\n\nMatch .git pointer files in the default import policy after the existing\ndirectory rules, preserving ordinary-checkout exclusion provenance and Git\nHEAD discovery. Cover linked-worktree identities, repeated imports, nested\nmetadata, similarly named source files, and configured-secret precedence.\n\nIndependent review: parent independent review APPROVE for Draft CI on patch\n61bddf108952c77858fa71c333b4bb8a05ab33e8b03f5c6bccd879cd19c7c379 and source\ntree 2d2372a9ec136eddac7743ce724c1b3ffc23013b. Review triggers: delegated\nshipping output, source inventory/file I/O behavior, and more than 50 lines.\n\nValidation: npm run check passed with Node 24.22.1/npm 11.16.0 on Windows;\ntracked Vitest regression 1 passed/3 Windows skips; test discovery passed.\nEight offline Linux production imports passed on cached Node 22.19.0 as\nsupporting evidence only. Pinned Linux/macOS Vitest cases await hosted CI.\n\nFixes #7551\n\n* test(reference): Isolate worktree fixtures from host Git settings\n\nRoute every fixture Git command through one wrapper with a filtered child\nenvironment, owned empty global config/template/hook paths, and no system\nconfig reads. Keep resource cleanup under the existing temporary owner.\nThese settings are scoped to synthetic child processes; host Git settings\nand this repository's commit/push checks are unchanged.\n\nTargeted independent review: parent review APPROVE on patch\n4be9a2af3e40edac3d64f687170e966a87fcf762f1877f2c55016e120bcd90ac and tree\na2ba91ee9cdb03873ff5fa81030a5f0608172930. The reviewer confirmed the native\nproof helper hash, complete fixture command coverage, and owned cleanup.\nReview triggers: delegated follow-up and fixture file/process boundaries.\n\nValidation: npm run check:fast passed; targeted Vitest 1 passed/3 native\nWindows skips. On pinned Node 24.22.1, the actual helper rejects inherited\nhooks/templates while commit, worktree creation, HEAD and status checks pass.\nThe unisolated control copies the injected template and its commit fails.\n\nRefs #7551", + "parents": ["f5cfe09c07e6110b23301c198340014f8b8db6be"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7667] + }, + { + "sha": "8db538a7ca85318d320e83fd8d4d714cfd978c14", + "subject": "fix(browser): keep negative script columns Chrome reports (#8684)", + "body": "fix(browser): keep negative script columns Chrome reports (#8684)\n\n* fix(browser): keep negative script columns Chrome reports\n\nChrome reported a Debugger.scriptParsed event with startColumn -60 and\nendColumn -15 for an inline script in WordPress's helper frame. CDP declares\nthese columns as plain integers, but REA's admission required min(0), so one\nscript failed the whole observe-web-execution run with unreadable_output.\n\nCDP resource columns now share one representation, cdpResourceColumnSchema,\nfor script start/end columns, initiator call frames, parser initiators and\nevent listeners. Positions on a script's first line include its start column,\nso keeping the reported values keeps the documented script-relative\nconversion consistent. The domain contract and web runtime docs state that a\nnegative column does not locate a column in the resource.\n\nFixes #8674\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(browser): apply the CDP column policy to passive capture\n\ninspect_web_page and discover_webmcp_tools still read CDP columns through\ncdpSourceCoordinates, whose own >= 0 check turned a negative column into\nnull and reported invalid_protocol_value. WebMCP discovery also dropped the\ntool's whole registration_source.\n\ncdpResourceColumnSchema now lives with the domain's CDP observation schemas.\nRuntime admission, the passive coordinate helper and the runtime, console,\ninitiator and WebMCP output schemas all use it. Lines keep their\nnon-negative rule.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["e01fcfb4b2981a96ab817fe640eff35808e6153c"], + "authors": [ + { + "name": "Paritosh Lahre", + "email": "155938586+SandstromPL@users.noreply.github.com", + "user": { + "login": "SandstromPL", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8684] + }, + { + "sha": "4b961e3715375971aee6dec848827c9c072d947b", + "subject": "fix(cli): protect Amp settings during default registration (#8076)", + "body": "fix(cli): protect Amp settings during default registration (#8076)", + "parents": ["8db538a7ca85318d320e83fd8d4d714cfd978c14"], + "authors": [ + { + "name": "Liu Jie", + "email": "maxazure@gmail.com", + "user": { + "login": "maxazure", + "__typename": "User" + } + } + ], + "pullRequests": [8076] + }, + { + "sha": "4f7c4cc21834b1183655b532df104990180c66f6", + "subject": "docs(readme): add Join us on Discord button (#8754)", + "body": "docs(readme): add Join us on Discord button (#8754)", + "parents": ["4b961e3715375971aee6dec848827c9c072d947b"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8754] + }, + { + "sha": "28bffe92c82c520d1863165d586884edc9fce9ce", + "subject": "docs(readme): move Discord button below site links (#8755)", + "body": "docs(readme): move Discord button below site links (#8755)", + "parents": ["4f7c4cc21834b1183655b532df104990180c66f6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8755] + }, + { + "sha": "8c857ce56c68ca46d202db0c9571277974c9e167", + "subject": "docs(readme): move Discord button below site links", + "body": "docs(readme): move Discord button below site links\n\nPlace the Join us on Discord button under each hero's website, guides,\nand showcases line. The invite and alt text stay the same.\n", + "parents": ["28bffe92c82c520d1863165d586884edc9fce9ce"], + "authors": [ + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8756] + }, + { + "sha": "c28d47bf135b1cce85d71b22e7f9f9214ee5ac16", + "subject": "fix(electron): retain wrapped protocol handler registrations", + "body": "fix(electron): retain wrapped protocol handler registrations\n", + "parents": ["8c857ce56c68ca46d202db0c9571277974c9e167"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8799] + }, + { + "sha": "e8cb71740b40a574a328d3cc778784662090c2ac", + "subject": "test(electron): remove duplicate graph protocol fixture", + "body": "test(electron): remove duplicate graph protocol fixture", + "parents": ["c28d47bf135b1cce85d71b22e7f9f9214ee5ac16"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8799] + }, + { + "sha": "19082acddbb3ddab5e381274ca38dcecbc292723", + "subject": "test(electron): consolidate handler presence coverage in public workflows", + "body": "test(electron): consolidate handler presence coverage in public workflows", + "parents": ["e8cb71740b40a574a328d3cc778784662090c2ac"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8799] + }, + { + "sha": "276d99e787cb777234ff50d9b9b2756a36973d83", + "subject": "fix(plist): decode OpenStep quoted string unicode and octal escape sequences (#8794)", + "body": "fix(plist): decode OpenStep quoted string unicode and octal escape sequences (#8794)", + "parents": ["19082acddbb3ddab5e381274ca38dcecbc292723"], + "authors": [ + { + "name": "highmachs", + "email": "samarjeeth06@gmail.com", + "user": null + } + ], + "pullRequests": [] + }, + { + "sha": "9a68ce57a0891551c3494bcdb945f81a987aadd6", + "subject": "test(elf): cover big-endian ABI notes through CLI and MCP (#8803)", + "body": "test(elf): cover big-endian ABI notes through CLI and MCP (#8803)", + "parents": ["276d99e787cb777234ff50d9b9b2756a36973d83"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8803] + }, + { + "sha": "26b033d51fd627af0cfdf47efcbdb346484e1c85", + "subject": "fix(process): classify withheld Darwin environments before parser failures", + "body": "fix(process): classify withheld Darwin environments before parser failures\n", + "parents": ["9a68ce57a0891551c3494bcdb945f81a987aadd6"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "f3e5b33538e210dee41c98d72036e7849b51d6c3", + "subject": "fix(artifacts): settle transient DMG verification within its deadline", + "body": "fix(artifacts): settle transient DMG verification within its deadline\n", + "parents": ["26b033d51fd627af0cfdf47efcbdb346484e1c85"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "6be6596aaca5a9f584fd726b9ca7733d5b54f55a", + "subject": "test(mcp): bound schema compilation for native and web workflows", + "body": "test(mcp): bound schema compilation for native and web workflows\n", + "parents": ["f3e5b33538e210dee41c98d72036e7849b51d6c3"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [] + }, + { + "sha": "c3647ade1e557c4179a8b825a37e0c2193cd2526", + "subject": "fix(objdump)!: preserve unknown executable identity (#8824)", + "body": "fix(objdump)!: preserve unknown executable identity (#8824)\n\n* fix(objdump)!: preserve unknown executable identity\n\n* fix(objdump): avoid claiming rejected architecture output\n\n* fix(objdump): align launch errors with command identity\n\n* test(objdump): avoid coupling identity checks to wording\n\n* test(objdump): align launch failure expectations", + "parents": ["6be6596aaca5a9f584fd726b9ca7733d5b54f55a"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8824] + }, + { + "sha": "e75d1c741ccf3e3ce6ff1e4533b60febde6543ec", + "subject": "feat(elf): decode Linux core dump process and memory mapping notes (#8830)", + "body": "feat(elf): decode Linux core dump process and memory mapping notes (#8830)\n\n* feat(elf): decode Linux core dump process and memory mapping notes\n\nInspect Linux core dump note tables and decode structured metadata without\nrequiring external tools or debuggers:\n- NT_PRPSINFO (type 3): decode process ID, parent ID, process group,\n session, UID, GID, execution state, filename, and command line arguments\n bounded by the text budget.\n- NT_FILE (type 0x46494c45): decode mapped memory ranges (start_address,\n end_address, file_offset_pages) and mapped file paths with page size.\n- NT_SIGINFO (type 0x53494749): decode faulting signal number, errno, and code.\n- NT_AUXV (type 6): decode auxiliary vector pairs with known AT_* tag names.\n- Support both 32-bit and 64-bit, little-endian and big-endian targets.\n- Retain unknown core note types gracefully without partial success errors.\n- Add comprehensive unit tests, fixtures, acceptance tests, and documentation.\n\n* fix(elf): preserve raw path bytes and enforce auxv termination\n\n* fix(elf): account for path hex text budget and enforce auxv trailing padding\n\n* fix(elf): account for row and scan limits, ABI signal order, and lossless source IDs\n\n* fix(elf): cache auxv padding scans, pre-charge entries, and isolate page-size test", + "parents": ["c3647ade1e557c4179a8b825a37e0c2193cd2526"], + "authors": [ + { + "name": "Rishikesh Gowda K K", + "email": "rishikeshgowdakk@gmail.com", + "user": { + "login": "rishikeshgowdakk", + "__typename": "User" + } + } + ], + "pullRequests": [8830] + }, + { + "sha": "f8f9095d2d280c6d5ed8f62f28bd073b9f050f20", + "subject": "feat(kuna): verify release 1.990 (#8813)", + "body": "feat(kuna): verify release 1.990 (#8813)", + "parents": ["e75d1c741ccf3e3ce6ff1e4533b60febde6543ec"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8813] + }, + { + "sha": "5a11bf09a5b8420584d097e0069194bb08c8a3d0", + "subject": "fix(mcp): surface byte search for encoded literals (#8817)", + "body": "fix(mcp): surface byte search for encoded literals (#8817)", + "parents": ["f8f9095d2d280c6d5ed8f62f28bd073b9f050f20"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8817] + }, + { + "sha": "d7df9df3393f77c78a76a06144ff4f515d5db928", + "subject": "fix(ghidra): mark empty xrefs results as unresolved, not unreferenced (#8831)", + "body": "fix(ghidra): mark empty xrefs results as unresolved, not unreferenced (#8831)\n\n* fix(ghidra): mark empty xrefs results as unresolved, not unreferenced\n\nGhidra 12.2 resolves no references to data addresses on some Mach-O\nimports, and xrefs returned a bare empty list with nothing separating\n'no references exist' from 'this provider resolved no references', so\ncallers concluded addresses were unreferenced.\n\nprojectExecution now attaches ghidraEmptyXrefsLimitation to an empty\nxrefs result: the list reflects what this analysis resolved, not proof\nthe address is unreferenced. Non-empty results carry no caveat.\n\nCovered by behavior tests for both branches; validated against\nFM9-Edit-arm64 (expect: limitation) once the daemon session reopens.\n\n* fix(ghidra): drop circular trace_feature cross-check from empty xrefs caveat\n\ntrace_feature calls xrefs internally, so recommending it as an independent\ncross-check repeats the same lookup the caveat qualifies. Keep disassembly\nas the single independent check.\n\n* fix(ghidra): report actionable-reference absence and invalidate stale snapshots\n\nReview follow-up on the empty xrefs caveat:\n- The bridge filters synthetic entry-point references before observation, so\n \"resolved no references\" could be false; the caveat now reports that no\n actionable references were returned and names the omission.\n- Drop the trace_feature cross-check: traceReferences observes xrefs per\n matched string, repeating the same lookup instead of independent evidence.\n- Bump instruction_references semantics to v3 so analysis snapshots captured\n before the caveat replay no bare empty results; the profile commitment in\n the snapshot binding no longer matches.\n\n* feat(ghidra): mark empty function-reference facets as unresolved too\n\nExtends the empty-xrefs caveat to the sibling ReferenceManager consumers\nreview follow-up identified: procedure_references and analyze_function\nreference facets built on the same observation path could still present\nempty arrays as collected facts.\n\n- ghidraEmptyFunctionReferencesLimitation attaches when\n procedure_references returns no references for the requested direction\n and when a dossier observes no references in either direction;\n callers/callees (function-manager derived, observed working on the\n reported target) stay caveat-free.\n- One emptyReferenceCaveat owner replaces the inline xrefs branch.\n- function_references semantics bump to v3 so snapshots captured before\n the caveat do not replay bare empty facets; raw profile digests\n recomputed.\n\n* fix(ghidra): cover annotation and instruction reference facets in the caveat\n\nReview follow-up: annotate_native_function returns a dossier built by the\nsame analyzeFunction collection and inspect_native_instruction builds\nincoming_references with visitObservedReferencesTo; both could present\nempty arrays as collected facts under the reported ReferenceManager\nfailure.\n\n- annotate_native_function attaches the caveat when its dossier observes\n no references in either direction.\n- inspect_native_instruction attaches it when incoming_references is an\n explicit empty array (null or omission stays unavailable, matching the\n field contract).\n- Split the diagnostics describe to keep each block under the lint bound.\n- Behavior tests cover attach and non-attach for both operations.\n\n* fix(ghidra): name the honest cross-check limits in the reference caveats\n\nReview follow-up: the motivating failure was a string address, so\n'cross-check the disassembly at this address' pointed at nothing — data\nand string addresses have no instruction to disassemble — and\ninspect_native_instruction's incoming_references is built through the\nsame visitObservedReferencesTo path, so it was not independent either.\n\n- xrefs caveat now states that no independent in-product cross-check\n exists for the empty result, that surrounding disassembly only helps\n at a code address, and that data or string addresses need an external\n disassembly scan (otool -tV adrp/add pairing).\n- Function-facet caveat separates outgoing references (own disassembly\n is independent) from incoming references (no in-product check; scan\n other code externally).\n\n* fix(ghidra): use the address-scoped caveat for inspect_native_instruction\n\nGreptile review follow-up: inspect_native_instruction checks incoming\nreferences to one exact address, so the function-scoped caveat misdescribed\nthe scope; an instruction can be unreferenced while its function has\nreferences elsewhere, and the address may have no containing function.\nAttach the address-scoped xrefs caveat instead.\n\n* fix(ghidra): qualify each empty reference direction independently\n\nAnalyze-function and annotate-native-function results attached the\nunresolved-references caveat only when BOTH reference directions were\nempty, so a dossier with one populated direction presented its empty\ndirection as a collected fact.\n\nSplit the combined function-references caveat into direction-scoped\nlimitations and attach one per empty direction (analyze_function,\nannotate_native_function dossier readback, procedure_references by its\nrequested direction).\n\n* fix(ghidra): qualify empty outgoing instruction references\n\ninspect_native_instruction results carry two independent\nReferenceManager facets: the incoming list and the outgoing references\nbuilt from instruction.getReferencesFrom(). Only the incoming list was\nchecked, so an instruction with a populated incoming list and no\noutgoing references presented the empty outgoing facet as a collected\nfact, and any populated incoming list suppressed the caveat entirely.\n\nEach facet is now qualified independently: the empty incoming list\nkeeps the address-scoped caveat; the empty outgoing list attaches the\nnew instruction-scoped outgoing limitation (this stream is not\nentry-point filtered, so it claims no entry-point omission). Truth\ntable covered in describe(\"Ghidra empty instruction reference facets\").\n\n* fix(ghidra): gate the instruction outgoing caveat on decoded status\n\nNon-decoded inspect_native_instruction results (data, not-in-listing,\nnot-instruction-boundary, outside-memory) return before the bridge ever\nqueries instruction.getReferencesFrom(), so their empty references list\nis an unobserved facet, not an empty ReferenceManager observation. The\nunconditional outgoing caveat claimed the ReferenceManager returned no\nreferences from an instruction that does not exist at that address.\n\nThe outgoing limitation now attaches only when status is decoded; the\naddress-scoped incoming caveat still applies per the empty incoming\nlist, matching the original motivating data-address case.\n\n* fix(ghidra): dossier incoming omission and external outgoing recovery\n\nTwo unqualified cases remained in the function-reference caveats:\n\n- The analyze_function/annotation dossier excludes incoming references\n whose source is inside the function's own body (a self-recursive call\n is enough), so the projected empty list can mean 'no outside source\n observed' or 'only in-body sources observed'. The dossier now uses a\n dedicated incoming limitation naming the exclusion, pointing at the\n outgoing edges/disassembly where in-body edges remain visible, and at\n procedure_references(incoming) - the same ReferenceManager stream\n without the in-body exclusion - as the in-product discriminator.\n procedure_references keeps the generic incoming caveat: its incoming\n stream is not in-body filtered.\n\n- An external function has no local body, so the outgoing caveat's\n 'function's own disassembly' recommendation was impossible. Records\n classified external now get an external-specific outgoing limitation\n naming the defining artifact and this program's call sites instead\n (procedure_references outgoing, analyze_function, annotation readback).\n\n* fix(ghidra): qualify dossier incoming caveat observation\n\nThe dossier-specific incoming caveat claimed the ReferenceManager\nobserved no incoming references from outside the body, but\nvisitObservedReference (ReaGhidraBridge.java:3973-3974) drops\nentry-point references before the body filter (1619-1621), so the\nmanager may have returned references the dossier never reports.\nReframe as 'returned no actionable' and name both omissions; correct\nthe recovery claim: procedure_references(incoming) lacks the in-body\nfilter but omits synthetic entry-point references as well.", + "parents": ["5a11bf09a5b8420584d097e0069194bb08c8a3d0"], + "authors": [ + { + "name": "Pierre", + "email": "pierre.poissinger@gmail.com", + "user": { + "login": "pijalu", + "__typename": "User" + } + } + ], + "pullRequests": [8831] + }, + { + "sha": "650a4593461ca90e71731425148d9325f3a27b19", + "subject": "fix(cli): share boolean timing argument handling (#8857)", + "body": "fix(cli): share boolean timing argument handling (#8857)\n\n* fix(cli): share boolean timing argument handling\n\n* fix(cli): preserve executable launcher mode", + "parents": ["d7df9df3393f77c78a76a06144ff4f515d5db928"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8857] + }, + { + "sha": "1998e65705afd04dee078724932fa98d446248b9", + "subject": "fix(ghidra): discover installed versioned Homebrew JDKs (#8853)", + "body": "fix(ghidra): discover installed versioned Homebrew JDKs (#8853)\n\n* fix(ghidra): discover installed versioned Homebrew JDKs\n\n* test(ghidra): protect Homebrew Java candidate precedence\n\n* fix(ghidra): continue automatic JDK discovery after a failed keg", + "parents": ["650a4593461ca90e71731425148d9325f3a27b19"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8853] + }, + { + "sha": "772c1bc40167ce387bc9d7dd43f63ca043407079", + "subject": "fix(pe): reject empty and non-minimal certificate serial INTEGERs (#8836)", + "body": "fix(pe): reject empty and non-minimal certificate serial INTEGERs (#8836)", + "parents": ["1998e65705afd04dee078724932fa98d446248b9"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [8836] + }, + { + "sha": "6c3c5ebc69c408f938ec200b58c8876548fed2c6", + "subject": "fix(rust): state inflate limits on the consumed zlib stream (#8835)", + "body": "fix(rust): state inflate limits on the consumed zlib stream (#8835)", + "parents": ["772c1bc40167ce387bc9d7dd43f63ca043407079"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [8835] + }, + { + "sha": "47cedcc93aa639fb8445ab344308a6837d2b9d5a", + "subject": "fix(cli): reject empty artifact command targets before resolution (#8834)", + "body": "fix(cli): reject empty artifact command targets before resolution (#8834)", + "parents": ["6c3c5ebc69c408f938ec200b58c8876548fed2c6"], + "authors": [ + { + "name": "Abduallah Jamal", + "email": "60349056+abduallahJamal@users.noreply.github.com", + "user": { + "login": "abduallahJamal", + "__typename": "User" + } + } + ], + "pullRequests": [8834] + }, + { + "sha": "578e4bb71ae8ff66fdbc7f3ade62638fb965528d", + "subject": "docs(installation): list every engine accepted by doctor --provider (#4767)", + "body": "docs(installation): list every engine accepted by doctor --provider (#4767)\n\nThe One analysis engine readiness row offered ghidra (or hopper, ida) while\nthe CLI accepts hopper, ghidra, ida, jadx and kuna for doctor --provider.\nAdd the missing IDs and keep the table aligned.\n\nRelated to #4624: docs/cli.md carries the same stale enumeration and is\nupdated separately in #4651.", + "parents": ["47cedcc93aa639fb8445ab344308a6837d2b9d5a"], + "authors": [ + { + "name": "SathishM", + "email": "sathish085580@gmail.com", + "user": { + "login": "sathish123m", + "__typename": "User" + } + } + ], + "pullRequests": [4767] + }, + { + "sha": "6ba69cdcc1f65f61e49a429c75582164f494575c", + "subject": "docs(cli): document standard input for JSON request arguments (#7139)", + "body": "docs(cli): document standard input for JSON request arguments (#7139)\n\nAn argument that accepts inline JSON or a JSON file path also reads the\nrequest from standard input when it is \"-\". The behavior shipped without\ndocumentation. Describe it next to the request-file example, with its\nUTF-8, byte-order mark and 8 MiB limits.\n\nFixes #7138", + "parents": ["578e4bb71ae8ff66fdbc7f3ade62638fb965528d"], + "authors": [ + { + "name": "Vinícius Andrade", + "email": "95101505+viniciusdsandrade@users.noreply.github.com", + "user": { + "login": "viniciusdsandrade", + "__typename": "User" + } + } + ], + "pullRequests": [7139] + }, + { + "sha": "67552d56cce45a4fedffa544f9f6e3bbcc418fcd", + "subject": "docs(limits): say setup forwards the selected MCP response budget (#8342)", + "body": "docs(limits): say setup forwards the selected MCP response budget (#8342)\n\nThe design guide said the setup allowlist does not copy\nREA_MCP_MAX_RESPONSE_BYTES, but SELECTED_REGISTRATION_SETTINGS includes\nit and setup forwards an explicit selection, as the client guide states.\n\nFixes #7420", + "parents": ["6ba69cdcc1f65f61e49a429c75582164f494575c"], + "authors": [ + { + "name": "김준호", + "email": "101695482+chordpli@users.noreply.github.com", + "user": { + "login": "chordpli", + "__typename": "User" + } + } + ], + "pullRequests": [8342] + }, + { + "sha": "52ff3123cbe07afbbadb3c5d24955cbba2d1835d", + "subject": "docs(mcp): list every tool that omits the untrusted-content marker (#8837)", + "body": "docs(mcp): list every tool that omits the untrusted-content marker (#8837)", + "parents": ["67552d56cce45a4fedffa544f9f6e3bbcc418fcd"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [8837] + }, + { + "sha": "1df7ac9320cb8cfbabb5fa3b2ca02f3a86b2c376", + "subject": "fix(ghidra): update the host no-return probe for the current bridge (#8462)", + "body": "fix(ghidra): update the host no-return probe for the current bridge (#8462)\n\nThe host no-return verifier, scripts/verify-real-ghidra-noreturn.mjs,\nfails before its Evidence checks. ReaNoReturnProbe calls private bridge\nmethods through reflection, and two bridge changes left the probe behind:\n\n- d4bd65c53 added a Function parameter to noReturnCallLimitations, and\n 225f26a5f renamed the method to functionBoundaryLimitations. The probe\n still looked up noReturnCallLimitations(Iterable) and stopped with\n NoSuchMethodException.\n- 01a1b3fda made procedureReferences return a function observation\n envelope. The probe read references and unresolved_calls from the top\n level of that envelope instead of from its value.\n\nPass each function and its instructions to functionBoundaryLimitations,\nand read procedureReferences results from the envelope value. The require\nchecks are unchanged. CI does not run this verifier.\n\nThese edits are the probe repair from robotaro's open draft that treats\ndemangled C++ runtime imports as returning, copied line for line, so\neither change merges cleanly after the other.\n\nCo-authored-by: robotaro <1141230+robotaro@users.noreply.github.com>", + "parents": ["52ff3123cbe07afbbadb3c5d24955cbba2d1835d"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + }, + { + "name": "robotaro", + "email": "1141230+robotaro@users.noreply.github.com", + "user": { + "login": "robotaro", + "__typename": "User" + } + } + ], + "pullRequests": [8462] + }, + { + "sha": "f8ec48095a2c4c1d2eb3836491c9ffcd625d7911", + "subject": "fix(cli): guide delimited analysis view exports (#8730)", + "body": "fix(cli): guide delimited analysis view exports (#8730)\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>", + "parents": ["1df7ac9320cb8cfbabb5fa3b2ca02f3a86b2c376"], + "authors": [ + { + "name": "hhang", + "email": "17309584214@163.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + } + ], + "pullRequests": [8730] + }, + { + "sha": "007e181f680250f8b2325c6e0c2d993058d0dd2a", + "subject": "fix(javascript): require exactly one fork IPC channel (#8017)", + "body": "fix(javascript): require exactly one fork IPC channel (#8017)\n\n* fix(javascript): require exactly one fork IPC channel\n\nNode's fork() rejects an explicit stdio array that carries more than one IPC\nchannel, and the throw is synchronous, before any child process exists:\n\n if (ArrayPrototypeFilter(options.stdio, ...'ipc').length > 1)\n throw new ERR_IPC_ONE_PIPE()\n\nThe analysis already dropped an array with no \"ipc\" (#7992) but still reported a\nresolved fork for an array carrying it twice.\n\nMeasured on Node 24.22.1:\n\n fork({stdio: [\"ipc\", \"ipc\"]}) -> THROWS ERR_IPC_ONE_PIPE\n fork({stdio: [\"pipe\", \"ipc\", \"ipc\"]}) -> THROWS ERR_IPC_ONE_PIPE\n fork({stdio: [\"ipc\"]}) -> SPAWNED connected=true\n fork({stdio: [\"pipe\", \"ipc\"]}) -> SPAWNED connected=true\n fork({stdio: [\"pipe\", \"pipe\", \"pipe\", \"ipc\"]})-> SPAWNED connected=true\n\nSo the required count is exactly one, not at least one. Count the resolved \"ipc\"\nliterals and reject the candidate unless the count is one; a spread or an\nunreadable element may still change the count and is left alone, as before.\n\n* chore: retrigger title and readiness checks after the title was corrected", + "parents": ["f8ec48095a2c4c1d2eb3836491c9ffcd625d7911"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8017] + }, + { + "sha": "a56cc93cabe81242dcadaee85a129a14fc05bd2a", + "subject": "test(desktop): cover ENOTDIR intermediate path refusal (#8692)", + "body": "test(desktop): cover ENOTDIR intermediate path refusal (#8692)\n\n* test(desktop): cover ENOTDIR intermediate path refusal\n\nLock the desktop consumer projection for selections whose intermediate\ncomponent is a regular file, matching inspect-artifact's unavailable-target\nrefusal after directory source spelling validation.\n\nFixes #7424\n\n* style: oxfmt ArtifactSourceResolution test", + "parents": ["007e181f680250f8b2325c6e0c2d993058d0dd2a"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [8692] + }, + { + "sha": "5b953e13c4451df3afcaab7724c06db5eedf58f7", + "subject": "fix(mcp): keep detail guidance in compact input schemas (#8034)", + "body": "fix(mcp): keep detail guidance in compact input schemas (#8034)\n\nCompact input schemas are the default advertisement since #5975, and the\nprofile drops every property description. On 23 of the 31 tools with a\nguided `detail` option, including inspect_artifact and inspect_macho,\n`detail` is advertised as a bare complete|summary enum, so callers take the\ncomplete default. On a universal macOS app that reply was about 699k\ncharacters for inspect_artifact and 336k for inspect_macho, against about\n4.4k and 3.2k with summary.\n\nKeep the canonical description of a root `detail` property in the inline\ncompact input form. The reduced form already keeps first-level guidance, and\ncompact output schemas are unchanged. Advertised compact input schemas grow\nfrom 127,616 to 133,358 bytes across 233 tools; the largest schema stays at\n4,107 bytes, within the 13,312-byte budget.\n\nThe new boundary test compares `detail` guidance between the full and compact\ntools/list and fails before the change.", + "parents": ["a56cc93cabe81242dcadaee85a129a14fc05bd2a"], + "authors": [ + { + "name": "Christopher Pruijsen", + "email": "christopher.pruijsen@gmail.com", + "user": { + "login": "cpruijsen", + "__typename": "User" + } + } + ], + "pullRequests": [8034] + }, + { + "sha": "4910e149ad9b2d8e3c3d0be62332b633ac418889", + "subject": "docs(setup): describe FreeBuff as published setup support (#7246)", + "body": "docs(setup): describe FreeBuff as published setup support (#7246)\n\nSetup against npm latest already accepts --client freebuff. Replace the\nstale proposed-integration wording while keeping the unverified native\nclient loading caveat.", + "parents": ["5b953e13c4451df3afcaab7724c06db5eedf58f7"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [7246] + }, + { + "sha": "703c11c90fb5a24dd9f511b1ad5eede336df6885", + "subject": "fix(javascript): recover configuration file reads from fs/promises (#8446)", + "body": "fix(javascript): recover configuration file reads from fs/promises (#8446)\n\n* fix(javascript): recover configuration file reads from fs/promises\n\n* fix(javascript): disallow nonexistent readFileSync on fs/promises\n\n---------\n\nCo-authored-by: Tawhidul Islam <276017696+FhDBro@users.noreply.github.com>", + "parents": ["4910e149ad9b2d8e3c3d0be62332b633ac418889"], + "authors": [ + { + "name": "Tawhidul Islam", + "email": "fahadsart.bd2@gmail.com", + "user": { + "login": "FhDBro", + "__typename": "User" + } + }, + { + "name": "Tawhidul Islam", + "email": "276017696+FhDBro@users.noreply.github.com", + "user": { + "login": "FhDBro", + "__typename": "User" + } + } + ], + "pullRequests": [8446] + }, + { + "sha": "810cebcba07d1a793b8657a7f3a5c14fe5995206", + "subject": "fix(ghidra): explain read-only project edit refusals (#8413)", + "body": "fix(ghidra): explain read-only project edit refusals (#8413)\n\n* fix(ghidra): explain read-only project edit refusals\n\n* test: follow provider guidance ownership", + "parents": ["703c11c90fb5a24dd9f511b1ad5eede336df6885"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8413] + }, + { + "sha": "d857b61bc56cf23b4081095078b095d31d8bf4bb", + "subject": "fix(android): ignore action-less filters in activity export defaults (#8030)", + "body": "fix(android): ignore action-less filters in activity export defaults (#8030)\n\nAndroid's package parser discards an activity, activity-alias or receiver\nintent filter that declares no action, so such a filter neither makes the\ncomponent exported by default nor triggers the API 31 explicit-export\nrequirement. Services keep action-less filters. The manifest inventory\ncounted every declared filter, reporting exported_default true (or an\nexplicit-export validation error) for components Android does not export.\nintent_filter_count still reports every declared filter.", + "parents": ["810cebcba07d1a793b8657a7f3a5c14fe5995206"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [8030] + }, + { + "sha": "d0d31fcf21e43761e251922c99552c3b2e740222", + "subject": "fix(browser): accept 3-digit HTTP response status codes up to 999 (#8075)", + "body": "fix(browser): accept 3-digit HTTP response status codes up to 999 (#8075)", + "parents": ["d857b61bc56cf23b4081095078b095d31d8bf4bb"], + "authors": [ + { + "name": "highmachs", + "email": "samarjeeth06@gmail.com", + "user": null + } + ], + "pullRequests": [] + }, + { + "sha": "1861059f8b37dadd9a84f716fef67611750c6422", + "subject": "fix(wasm): name the compare_wasm_interfaces side of rejected Evidence (#7302)", + "body": "fix(wasm): name the compare_wasm_interfaces side of rejected Evidence (#7302)\n\n* fix(wasm): name the compare_wasm_interfaces side of rejected Evidence\n\ncompare_wasm_interfaces parsed both sides inside one try and reported any rejection, such as tampered content, a different operation or a rebound subject, as an input issue at path [], which names no argument. Each side is now parsed separately and a rejection is reported at [left] or [right], as the function, native and managed comparers already do.\n\n* test(wasm): cover both comparison sides through the MCP boundary", + "parents": ["d0d31fcf21e43761e251922c99552c3b2e740222"], + "authors": [ + { + "name": "Adolanium", + "email": "94890352+Adolanium@users.noreply.github.com", + "user": { + "login": "Adolanium", + "__typename": "User" + } + } + ], + "pullRequests": [7302] + }, + { + "sha": "1f8084c7db806354ebe571e1490264b128ef92c2", + "subject": "fix(node-sea): bound ELF note scans by the notes a carrier holds (#8031)", + "body": "fix(node-sea): bound ELF note scans by the notes a carrier holds (#8031)\n\nArtifact classification probes every ELF root for a Node SEA note. Each\nPT_NOTE program header was scanned on its own, one read per note, so\nheaders that declare the same note bytes multiplied the work: a 295 KB\nELF with 4,096 such headers kept inspect-artifact busy for about three\nand a half minutes.\n\nEvery note header takes at least 12 bytes, so disjoint tables hold at\nmost one note per 12 file bytes. The scan now stops there. Past that\ncount the remaining tables are unreadable: an ELF without a confirmed\nblob keeps its native classification, and a confirmed blob fails closed.", + "parents": ["1861059f8b37dadd9a84f716fef67611750c6422"], + "authors": [ + { + "name": "Dragolone", + "email": "160818051+Dragolone@users.noreply.github.com", + "user": { + "login": "Dragolone", + "__typename": "User" + } + } + ], + "pullRequests": [8031] + }, + { + "sha": "f042aaaf90d7528a2589a8b4e55071e8c2cdd013", + "subject": "fix(gdb): keep sessions usable after an oversized stream record (#8029)", + "body": "fix(gdb): keep sessions usable after an oversized stream record (#8029)\n\n* fix(gdb): keep sessions usable after an oversized stream record\n\nA single MI console, target or log record over the 16 MiB line limit\nfailed the whole session protocol, so close could not re-synchronize\nand GDB plus its inferior stayed owned with no recovery path.\n\nMI stream records carry only output and c-strings escape newlines, so\na raw LF always ends the record. #receive now drops the remainder of\nan oversized stream record, marks pending command output and retained\nrecords truncated, and keeps parsing later lines; oversized result\nand async records still fail closed as before.\n\nFixes #8023.\n\n* fix(gdb): keep earlier records in a chunk with an oversized stream record\n\n* test(gdb): drop superseded oversized-record test copies", + "parents": ["1f8084c7db806354ebe571e1490264b128ef92c2"], + "authors": [ + { + "name": "Rohit Ghumare", + "email": "48523873+rohitg00@users.noreply.github.com", + "user": { + "login": "rohitg00", + "__typename": "User" + } + } + ], + "pullRequests": [8029] + }, + { + "sha": "1dd70f6c2b1c65c48171e931f16ed69d428fa235", + "subject": "fix(cli): seal in-process Evidence before publishing (#8468)", + "body": "fix(cli): seal in-process Evidence before publishing (#8468)\n\n* fix(cli): seal in-process Evidence before publishing\n\nThe CLI rebuilt a plain bundle from records it had already authenticated,\nso writeEvidenceBundle cloned and authenticated the complete analyzed\ngraph again at the final checkpoint. On a default heap that second copy\ncould exceed available memory after minutes of analysis and discard the\nwhole run.\n\nSeal the in-process bundle once so publication can stream the canonical\nform without the redundant authentication copies. The regression test\nfails on the previous behavior with resource_constraint under a one-byte\nheap allowance.\n\nFixes #8411\n\n* fix(cli): preserve the heap check for mutable Evidence\n\nOnly seal the publication bundle when every record is already immutable.\nMutable producer records keep the writer's existing heap check instead of\nbeing copied before that check. The regression now covers the safe\nfallback and lets the shared temporary-directory fixture own cleanup.\n\n* test(cli): keep a distinct mutable source in the publication regression\n\nSeal the main record and give the mutable source its own evidence ID so\nthe map cannot replace it before the bundle guard runs.", + "parents": ["f042aaaf90d7528a2589a8b4e55071e8c2cdd013"], + "authors": [ + { + "name": "2SinceJuly", + "email": "hongjxiao@gmail.com", + "user": { + "login": "2SinceJuly", + "__typename": "User" + } + } + ], + "pullRequests": [8468] + }, + { + "sha": "39172ca2e191763a87bedf889b1f970befd5d96c", + "subject": "fix(ghidra): keep a changed existing project's refusal typed through launch (#8273)", + "body": "fix(ghidra): keep a changed existing project's refusal typed through launch (#8273)\n\n* fix(ghidra): keep a changed existing project's refusal typed through launch\n\nWhen the selected REA_GHIDRA_PROJECT_PATH project changes after\nopen_binary commits its profile, the launcher's verified copy refuses it\nwith AnalysisArtifactChangedError. GhidraHeadlessLauncher wraps that in\nGhidraLaunchError, and the session error's cause became the wrapper, so\nthe projection missed the existing artifact_changed branch and returned\ngeneric execution_failure with rea doctor advice.\n\nRead the launcher's primary failure when it is an\nAnalysisArtifactChangedError, so the refusal reaches callers as\nartifact_changed with the changed path and the existing reopen guidance.\nThe refusal stays fail-closed: no automatic reopen or fresh-import\nfallback. Other launch failures keep their current projection.\n\nFixes #8217\n\n* fix(ghidra): describe a project profile mismatch without a timing claim\n\nWhen the owned copy of a selected Ghidra project no longer matches the\nfingerprint committed by open_binary, copyExistingGhidraProject threw\nRegularFileChangedError, so the artifact_changed reason said the input\n\"changed while being read\". A digest mismatch only shows that the\nproject differs from its committed profile; the change may have happened\nbefore the copy started.\n\nThrow AnalysisArtifactChangedError directly with a reason that states\nthe mismatch and leaves the time of the change unestablished. Changes\nobserved while files are being read keep their existing reason.", + "parents": ["1dd70f6c2b1c65c48171e931f16ed69d428fa235"], + "authors": [ + { + "name": "Machen John", + "email": "macjayzz1@gmail.com", + "user": { + "login": "macjayz", + "__typename": "User" + } + } + ], + "pullRequests": [8273] + }, + { + "sha": "a97f82746973613c77b6a93d0576b5383bfbb595", + "subject": "fix(pe): reject malformed certificate validity times (#8832)", + "body": "fix(pe): reject malformed certificate validity times (#8832)", + "parents": ["39172ca2e191763a87bedf889b1f970befd5d96c"], + "authors": [ + { + "name": "RRFZ", + "email": "247457381+Plastic-time@users.noreply.github.com", + "user": { + "login": "Plastic-time", + "__typename": "User" + } + } + ], + "pullRequests": [8832] + }, + { + "sha": "d5ba7cec60aeadd1bb7a5f4bef343d930651ecf9", + "subject": "fix(javascript): link a response body reader only to a settled fetch (#8028)", + "body": "fix(javascript): link a response body reader only to a settled fetch (#8028)\n\n* fix(javascript): link a response body reader only to a settled fetch\n\n`collectResponseConsumers` treated any `.json()`/`.text()`/`.arrayBuffer()` on a\nbinding holding a request result as a response consumer, and gave it the\nrequest's endpoint at `resolution: \"complete\"`. That holds only for a settled\n`fetch`.\n\nMeasured on Node 24.22.1:\n\n await fetch(u) -> Response json/text/arrayBuffer = function\n fetch(u) unawaited -> Promise json = undefined; pending.json() THROWS TypeError\n http.get(u) -> ClientRequest json/text/arrayBuffer = undefined\n http.request(u) -> ClientRequest json = undefined; request.text() THROWS TypeError\n new WebSocket(u) -> WebSocket socket.json() THROWS TypeError\n await http.get(u) -> ClientRequest (await does not help)\n\nSo four shapes emitted a resolved \"this endpoint's body is read here\" fact for a\ncall that throws before any body is read: an un-awaited fetch, `http.get`,\n`http.request`, and a `WebSocket` handshake.\n\nLink only requests that settle to a `Response`: a `fetch` call whose value is\nawaited through expression wrappers. A binding that also holds a request kind\nwithout a body reader keeps the consumer a candidate (`partial`) rather than a\nproven one, and a binding with no settled fetch emits no consumer at all, which\nmatches the `collectReleases` / `forkRejectsStdioArray` precedent — the receiver\nprovably has no such member, so there is no fact to report.\n\n* chore: retrigger title and readiness checks after the title was corrected", + "parents": ["a97f82746973613c77b6a93d0576b5383bfbb595"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8028] + }, + { + "sha": "6aeaa04e54cea0411822ca52632d10978fc341ea", + "subject": "fix(javascript): reuse shared AST child traversal (#7967)", + "body": "fix(javascript): reuse shared AST child traversal (#7967)", + "parents": ["d5ba7cec60aeadd1bb7a5f4bef343d930651ecf9"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7967] + }, + { + "sha": "3640f015126a97f1d60fa9821301b1cd8d90f127", + "subject": "fix(javascript): emit no promise for a literal non-callable executor (#8264)", + "body": "fix(javascript): emit no promise for a literal non-callable executor (#8264)\n\n* fix(javascript): emit no promise for a literal non-callable executor\n\nNode's `Promise` constructor calls the executor synchronously and throws a\n`TypeError` when it is not callable, before any promise object exists. The\nanalysis reported a `constructor` promise operation with a hardcoded\n`sourceResolution: \"complete\"`, which the graph projects as\n`creates-promise` `resolved`.\n\nMeasured on Node 24.22.1:\n\n new Promise() -> THREW TypeError\n new Promise(1) / (-1) -> THREW TypeError\n new Promise(\"work\") / (`work`) -> THREW TypeError\n new Promise(true) / (!0) -> THREW TypeError\n new Promise(null) / (void 1) -> THREW TypeError\n new Promise(1n) / (/re/) -> THREW TypeError\n new Promise([]) / ({}) -> THREW TypeError\n --- accepted ---\n new Promise(() => {}) -> OK Promise\n new Promise(async () => {}) -> OK Promise\n new Promise(function () {}) -> OK Promise\n new Promise(class {}) -> OK Promise\n\nA class passes Node's own `typeof` check, so it keeps its operation. An\nidentifier, a call result or a spread may still supply a function and also keeps\nits operation.\n\nThe filter gates the candidate push rather than `promiseCandidateDetails`, which\nalso decides whether an `await` becomes an `awaited-expression`: gating there\nmade `await new Promise(1)` emit a spurious task fact, whereas gating at the push\nsite makes it emit nothing, which is the honest answer.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* fix(javascript): reject a non-finite executor, not only a literal\n\ngreptile caught that `new Promise(1e309)` still emitted a promise. Babel stores\nthat literal as `Infinity`, and `readExactJavaScriptLiteral` refuses to price a\nnon-finite number, so the guard missed it.\n\nMeasured on Node 24.22.1 — every one throws before a promise exists:\n\n new Promise(1e309) -> THREW TypeError\n new Promise(1e400) -> THREW TypeError\n new Promise(Infinity) -> THREW TypeError\n new Promise(-Infinity) -> THREW TypeError\n new Promise(NaN) -> THREW TypeError\n\nA numeric literal is now read directly rather than through the exact-value\nreader. `Infinity` and `NaN` are identifiers rather than literals, so they are\ndecided through `isUnmodifiedGlobalReference`; a shadowed binding keeps its\npromise, which is the same scoping rule the timer fix uses.", + "parents": ["6aeaa04e54cea0411822ca52632d10978fc341ea"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8264] + }, + { + "sha": "094ec5eb3fbdb0c99e0b1950c6412d037b8f4501", + "subject": "fix(cli): reject missing mcp add option values (#7996)", + "body": "fix(cli): reject missing mcp add option values (#7996)\n\n* fix(cli): reject mcp add options missing their values (#7609)\n\n* fix(cli): reject mcp add values swallowed by the next flag (#7609)\n\n* fix(cli): reject empty mcp add -c value (#7609)\n\n* test(cli): verify rejected mcp add preserves settings\n\n* chore: keep main formatting out of merge diff", + "parents": ["3640f015126a97f1d60fa9821301b1cd8d90f127"], + "authors": [ + { + "name": "STDquantum", + "email": "60764289+STDquantum@users.noreply.github.com", + "user": { + "login": "STDquantum", + "__typename": "User" + } + } + ], + "pullRequests": [7996] + }, + { + "sha": "2ae7878fc7ce6aa40e6343ba5d1bcb81dbe0c4a0", + "subject": "fix(native): retain all breakpoint locations within budget (#7975)", + "body": "fix(native): retain all breakpoint locations within budget (#7975)\n\n* fix(native): retain all breakpoint locations within budget\n\n* fix(native): describe incomplete locations accurately\n\n* test(native): cover incomplete location warning\n\n* test(native): bind lipo failure to a real fixture\n\n* test(native): use valid Mach-O fixture for lipo errors\n\n* test(native): drop fixture change already in main\n\n* test(native): share breakpoint limitation wording with formatter\n\n* test(native): assert limitation delivery via owner constants\n\n* style(native): format breakpoint limitation projection", + "parents": ["094ec5eb3fbdb0c99e0b1950c6412d037b8f4501"], + "authors": [ + { + "name": "STDquantum", + "email": "60764289+STDquantum@users.noreply.github.com", + "user": { + "login": "STDquantum", + "__typename": "User" + } + } + ], + "pullRequests": [7975] + }, + { + "sha": "9cc34178c00cea6fb5f2938b4d7f102d2f83db05", + "subject": "test(native): bind lipo refusal fixture to a real source (#7977)", + "body": "test(native): bind lipo refusal fixture to a real source (#7977)", + "parents": ["2ae7878fc7ce6aa40e6343ba5d1bcb81dbe0c4a0"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7977] + }, + { + "sha": "f285fd4f8209656192f1511c453f9d70b663d995", + "subject": "fix(javascript): emit no child process for a literal non-object options slot (#8019)", + "body": "fix(javascript): emit no child process for a literal non-object options slot (#8019)\n\n* fix(javascript): emit no child process for a literal non-object options slot\n\nNode validates the child_process options object before creating anything, so a\nliteral primitive or a literal array in that slot throws ERR_INVALID_ARG_TYPE\nsynchronously and no child process exists. The analysis still reported a complete\nspawn for them.\n\nMeasured on Node 24.22.1:\n\n spawn(cmd, \"status\") -> THROWS ERR_INVALID_ARG_TYPE\n spawn(cmd, [], \"pipe\") -> THROWS ERR_INVALID_ARG_TYPE\n spawn(cmd, [], null) -> THROWS ERR_INVALID_ARG_TYPE\n spawn(cmd, [], []) -> THROWS ERR_INVALID_ARG_TYPE\n execFile(cmd, \"status\") -> THROWS ERR_INVALID_ARG_TYPE\n fork(worker, \"status\") -> THROWS ERR_INVALID_ARG_TYPE\n fork(worker, [], \"pipe\") -> THROWS ERR_INVALID_ARG_TYPE\n --- accepted by Node ---\n spawn(cmd, args, undefined) -> SPAWNED\n spawn(cmd, args, {}) -> SPAWNED\n execFile(cmd, [], null) -> SPAWNED\n fork(worker, [], null) -> SPAWNED\n exec(cmd, \"inherit\") -> SPAWNED\n\nThe asymmetries matter: `spawn` rejects `null` and exempts only `undefined`,\nwhile `fork` and `execFile` skip any nullish options, and `exec` spreads its\noptions and validates none of them. Drop a candidate only when the options slot\nis a provable literal primitive or array, so an unresolved or non-literal value\nstays a candidate.\n\n`spawn(cmd, [], null)` is the sharpest case: it was indistinguishable from the\nvalid `undefined` form, including a resolved connects-stdio relation, for a call\nthat dies before any child exists.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* fix(javascript): reject literal options Node shall reject, and drop a stray file\n\nTwo review findings on #8019.\n\ngreptile: `rejectsOptionsShape` still kept `spawn(\"tool\", [], 0n)`, `-0` and\n`1e400`, which Node also rejects before creating a child\n(`ERR_INVALID_ARG_TYPE: The \"options\" argument must be of type object`). Those\nforms are exactly the ones `readExactJavaScriptLiteral` refuses to price — a\nBigInt, a non-finite numeric literal and a negated numeric literal — so read the\nshape directly instead of widening the shared exact-value reader. `NaN` is an\nidentifier rather than a literal, so it still needs scope resolution and is left\nas a documented gap.\n\nAlso remove `.rea-hopper-stage-YOryZ6/`, a local Hopper installation stub that an\n`add -A` swept into the commit. It is unrelated to this change.\n\n* fix(javascript): keep a void options slot, reject ! and ~\n\ngreptile flagged that `isUnpricedPrimitiveLiteral` dropped `spawn(\"tool\", [], void 0)`,\n`fork(..., void 0)` and `execFile(..., void 0)`. It checked the unary operand without\nthe operator, but `void ` evaluates to `undefined`, which is the one options\nvalue Node accepts in place of an object.\n\nMeasured on Node 24.22.1:\n\n spawn(cmd, [], void 0) -> SPAWNED\n spawn(cmd, [], void 5) -> SPAWNED\n spawn(cmd, [], -0) -> THROWS ERR_INVALID_ARG_TYPE\n spawn(cmd, [], -5) -> THROWS ERR_INVALID_ARG_TYPE\n spawn(cmd, [], +5) -> THROWS ERR_INVALID_ARG_TYPE\n spawn(cmd, [], !0) -> THROWS ERR_INVALID_ARG_TYPE\n spawn(cmd, [], ~0) -> THROWS ERR_INVALID_ARG_TYPE\n\nSo the operator now decides: `void` keeps the spawn, `!` and `~` reject whatever\ntheir operand, and `+`/`-` reject only when the operand is a numeric literal.\n\n* fix(javascript): reject a non-finite global in the child-process options slot\n\nAn unshadowed `NaN` or `Infinity` in the options slot is a number, and Node's\noptions check rejects a number exactly as it rejects any other primitive. The\nguard read only literal nodes, so the global identifier passed through. Measured\non Node 24.22.1:\n\n spawn(\"e\", NaN) -> THREW ERR_INVALID_ARG_TYPE\n spawn(\"e\", Infinity) -> THREW ERR_INVALID_ARG_TYPE\n execFile(\"e\", NaN) -> THREW ERR_INVALID_ARG_TYPE\n fork(\"x.js\", NaN) -> THREW ERR_INVALID_ARG_TYPE\n --- accepted ---\n exec(\"e\", NaN) -> ok, because exec validates no options\n spawn(\"e\", undefined) -> ok, the one accepted global\n spawn(\"e\", null) -> ok\n spawn(\"e\", []) / ({}) -> ok\n\n`isUnshadowedGlobal` keeps a local binding named `NaN` out of the rule, so a\nshadowed value keeps its fact. Seven regressions cover the rejected forms plus\n`exec`, `undefined`, `null`, an array, an object and a shadowed `NaN`; all seven\nfail on the previous commit.", + "parents": ["9cc34178c00cea6fb5f2938b4d7f102d2f83db05"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8019] + }, + { + "sha": "54146627f04964ba26b9becbfd88b40fa5831ea7", + "subject": "fix(cli): emit compact JSON validation errors for demangle-swift (#7622)", + "body": "fix(cli): emit compact JSON validation errors for demangle-swift (#7622)\n\n* fix(cli): emit compact JSON validation errors for demangle-swift\n\nPiped and redirected --json argument diagnostics went through Incur's\nalways-indented Formatter, bypassing REA's destination-aware writer.\nBuffer non-TTY SDK JSON like JSONL and rewrite through writeJsonOutput.\n\n* fix(cli): keep token-count for piped SDK JSON documents\n\nCompact JSON rewrite for non-TTY SDK output returned early before\ntoken controls, so --llms/--schema --format json --token-count printed\nthe document instead of its count.\n\n* fix(cli): do not token-count non-document JSON captures\n\nCompletion hooks and other non-JSON --json pipe output must stay verbatim;\ntoken-count on non-JSON SDK captures applies only with sdkDocumentControls.\n\n* test(cli): assert demangle JSON validation by code, not wording", + "parents": ["f285fd4f8209656192f1511c453f9d70b663d995"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [7622] + }, + { + "sha": "2f5c0155dcfb27d19bff0fddd27733fa43a5442a", + "subject": "fix(web): omit importer integrity for the trusted resolver stub (#8693)", + "body": "fix(web): omit importer integrity for the trusted resolver stub (#8693)\n\n* fix(web): omit importer integrity for the trusted resolver stub\n\nImport-map integrity that covers the selected importer was applied to REA's\nreplacement resolver script. Strip only those integrity entries from the\ninstalled map so native resolution can proceed while preserving dependency\nintegrity and the caller-selected map identity.\n\nFixes #8544\n\n* fix(web): keep __proto__ import-map integrity keys on a null prototype", + "parents": ["54146627f04964ba26b9becbfd88b40fa5831ea7"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [8693] + }, + { + "sha": "066a23475c56b3144c9fdcc80b77ccaed22305d1", + "subject": "fix(artifacts): classify bundle executables by their own name (#7365)", + "body": "fix(artifacts): classify bundle executables by their own name (#7365)\n\n* fix(artifacts): classify bundle executables by their own name\n\nA directory bundle is selected for its executable, so the executable's\ncanonical name classifies it; the bundle directory spelling is not an\nartifact alias. Bundle facts now reach artifact, archive and database\ntargets so the admitted-source digest binds to the executable.\n\nFixes #7362\n\n* fix(artifacts): share the artifact identity across every artifact route\n\nThe trailing-archive fallback also carries the bundle facts now, so a\nbundle whose executable is a script stub with an appended ZIP keeps its\ndigest bound to the executable.\n\n* fix(artifacts): name the classification spelling at the resolver boundary\n\nThe resolver already knows whether a bundle directory or a file was\nselected, so it hands the executable or the caller's spelling to the\nreader instead of inferring it from the Info.plist. Every admitted route\nnow shares one identity, and the .app bundle operations accept a bundle\nwhatever its executable admitted as.\n\n* fix(artifacts): route bundle keyed archive reads by bundle facts\n\nA bundle whose executable is a plist now carries bundleInfoPlist, so\ninspect_keyed_archive must read bundle-relative archives instead of the\nstandalone route that compares the selected bundle directory with the\nexecutable.\n\n* refactor(artifacts): build the selected ESP flash identity from the shared owner\n\nThe selected ESP flash route from main built path, source path and digest\ninline. Use the resolver's shared identity so it carries the same facts as\nevery other admitted target.", + "parents": ["2f5c0155dcfb27d19bff0fddd27733fa43a5442a"], + "authors": [ + { + "name": "김준호", + "email": "101695482+chordpli@users.noreply.github.com", + "user": { + "login": "chordpli", + "__typename": "User" + } + } + ], + "pullRequests": [7365] + }, + { + "sha": "65311d49921b93075a4cbfdf1470de16ce405ad6", + "subject": "fix(process): preserve literal temporary-root absence text (#8859)", + "body": "fix(process): preserve literal temporary-root absence text (#8859)", + "parents": ["066a23475c56b3144c9fdcc80b77ccaed22305d1"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8859] + }, + { + "sha": "b668cea2af0fa2608885563195eef6cdea0cb602", + "subject": "fix(javascript): emit no fs acquisition for a literal non-flag string (#8125)", + "body": "fix(javascript): emit no fs acquisition for a literal non-flag string (#8125)\n\n* fix(javascript): emit no fs acquisition for a literal non-flag string\n\n`fs.open` and `fs.openSync` validate a literal flag before touching the\nfilesystem:\n\n if (!isFd(flags) && !FLAGS_SET.has(flags))\n throw new ERR_INVALID_ARG_VALUE('flags', flags, ...);\n\nThe throw is synchronous, before a descriptor exists, but the analysis reported\nan `acquire` operation for those calls.\n\nMeasured on Node 24.22.1 against a file that does not exist, so each valid flag\nis exercised without an EEXIST masking it:\n\n ACCEPTED as a flags string:\n a a+ as as+ ax ax+ r r+ rs rs+ sa sa+ sr sr+ w w+ wx wx+ xa xa+ xw xw+\n REJECTED with ERR_INVALID_ARG_VALUE:\n \"\" A R W rb wb s s+ x r,x\n\nA Python-style `\"rb\"`/`\"wb\"` is the common case: those are valid in Python and\nfatal at the Node call site.\n\n`FS_OPEN_FLAGS` in `javascriptStaticAnalysisHelpers.ts` already holds exactly\nthose 22 accepted flags. It is now exported and reused so the accepted set has\none owner. A numeric flag is a platform bitmask and a computed value may still be\nvalid, so only an exactly readable non-flag string is dropped.\n\n`fs.createReadStream` keeps its acquisition: it does not validate the flag\nsynchronously, it returns a stream and reports the failure on the error event.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* fix(javascript): reject every fs flag literal Node rejects\n\nThe first version only decided string flags. Node's check covers every flag\nshape, and each one below throws `ERR_INVALID_ARG_VALUE` or `ERR_OUT_OF_RANGE`\nsynchronously, before a descriptor exists:\n\n openSync(p, 1.5) -> THREW ERR_OUT_OF_RANGE\n openSync(p, -1) -> THREW EINVAL\n openSync(p, -1.5) -> THREW ERR_OUT_OF_RANGE\n openSync(p, 1e400) -> THREW ERR_OUT_OF_RANGE\n openSync(p, NaN) -> THREW ERR_OUT_OF_RANGE\n openSync(p, Infinity) -> THREW ERR_OUT_OF_RANGE\n openSync(p, 0n) -> THREW ERR_INVALID_ARG_VALUE\n openSync(p, true) -> THREW ERR_INVALID_ARG_VALUE\n openSync(p, false) -> THREW ERR_INVALID_ARG_VALUE\n openSync(p, {}) -> THREW ERR_INVALID_ARG_VALUE\n openSync(p, []) -> THREW ERR_INVALID_ARG_VALUE\n --- accepted ---\n openSync(p, 0) / 1 / 65536 / +5 -> ok\n openSync(p) / undefined / null -> ok\n openSync(p, \"r\") / \"wx\" / \"sr\" -> ok\n\n`NaN` and `Infinity` are identifiers rather than literals, so they are decided\nonly through `isUnmodifiedGlobalReference`; a shadowed binding keeps the\nacquisition.\n\n* fix(javascript): judge an fs flag by its value, and ignore a shifting spread\n\nTwo P1 findings on the first version.\n\n**A unary operator was judged by its operand.** `openSync(p, void 1.5)` passes\n`undefined`, so Node applies the default read flag, but the branch saw a\nfractional operand and dropped a real acquisition. `openSync(p, -0)` is the valid\nzero bitmask and was also dropped. `staticFlagBits` now evaluates the operator:\n\n openSync(p, void 1.5) -> ok (keeps the acquisition)\n openSync(p, void 0) -> ok\n openSync(p, -0) -> ok\n openSync(p, -0.0) -> ok\n openSync(p, +0) -> ok\n openSync(p, ~-1) -> ok\n openSync(p, -1) -> THREW EINVAL\n openSync(p, -1.5) -> THREW ERR_OUT_OF_RANGE\n openSync(p, +1.5) -> THREW ERR_OUT_OF_RANGE\n openSync(p, !0) -> THREW ERR_INVALID_ARG_VALUE\n openSync(p, ~0) -> THREW EINVAL\n openSync(p, typeof 1) -> THREW ERR_INVALID_ARG_VALUE\n\n**A spread before the flag slot shifts the runtime position.** With\n`args = [path, \"w\"]`, `openSync(...args, \"0600\")` opens with mode `\"0600\"`, but\nargument 1 is then the mode rather than the flag. The check now keeps the\nacquisition whenever argument 0 is a spread, because the flag it inspects is not\nprovably the flag at runtime.\n\n* fix(javascript): leave a signed fs bitmask undecided\n\ngreptile caught that the flag check rejected every negative integer, but Node\naccepts some signed bitmasks. Measured on Node 24.22.1 against an existing file:\n\n openSync(p, -2147483648) -> ok\n openSync(p, -1073741824) -> ok\n openSync(p, -1) -> THREW EINVAL\n openSync(p, -2) -> THREW EINVAL\n openSync(p, 2147483647) -> THREW EINVAL\n openSync(p, 2147483648) -> THREW ERR_OUT_OF_RANGE\n openSync(p, -2147483649) -> THREW ERR_OUT_OF_RANGE\n\nSo the sign does not decide: some negative values open a descriptor and others do\nnot, and which is which is a platform bitmask question this analysis cannot\nsettle. The check now rejects only a non-integer or a value outside the signed\n32-bit range, and leaves an in-range negative undecided — the same choice\n`greptile` asked for, on the principle that a call which may succeed must keep\nits acquisition.\n\n`!`, `typeof` and `delete` are still rejected, because those yield a boolean or a\nstring regardless of the operand.\n\n* fix(javascript): read a no-expression template literal flag\n\nReview finding. A no-expression template literal is exactly readable, so it is the\nsame flag string Node receives, but the guard only read `StringLiteral`:\n\n fs.openSync(p, ` + \"`rb`\" + `) -> THREW ERR_INVALID_ARG_VALUE\n fs.openSync(p, ` + \"`r`\" + `) -> ok\n\nThe flag slot now accepts an interpolation-free template; an interpolated template\nstays undecided.\n\nFour regressions cover both directions; two fail without the change.", + "parents": ["65311d49921b93075a4cbfdf1470de16ce405ad6"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8125] + }, + { + "sha": "848f16541746d11cf0ebd507f992b1c570128afb", + "subject": "feat(harmony): disclose unclassified inventory files (#4968)", + "body": "feat(harmony): disclose unclassified inventory files (#4968)\n\n* feat(harmony): disclose unclassified inventory files\n\n* test(harmony): let createEvidence own JSON admission in the partial-inventory case\n\n* test(harmony): extract the projection assertion from the archive journey\n\n* docs(harmony): qualify the unclassified disclosure rules and pin exact-case manifests\n\n* test(harmony): replace limitation prose with structured coverage facts\n\nThe partial-inventory control froze the sentence \"Source inventory coverage is\npartial; absence is unknown.\" verbatim. docs/testing.md asserts structured\nlimit facts instead of freezing explanatory sentences and puts documentation\nwording in review, so the sentence is no longer substring-matched.\n\n`coverage.status` is a disjunction of independent causes in this projection:\nincomplete inventory scope, unavailable content, and an exceeded bridge budget.\nAsserting only `status: \"partial\"` left that attribution unstated, so the two\nother causes are now pinned as well. `unavailable_components` being empty and\n`bridge_candidate_coverage` being complete with zero candidates make the partial\nresult attributable to the missing occurrence alone.\n\nAlso drops an `artifact_id` comparison that could not fail: the fixture's four\nfiles carry the same bytes, the preceding assertion already pins that shared\ndigest, and `artifact_id` is derived from the digest. Distinct paths sharing\ncontent stay covered by the path array and the independent digest expectations.\n\nNarrows a comment that claimed exact-case matching for every name in the\ncontrol; only the manifest names are case-sensitive, because the App Pack child\nsuffix match is case-insensitive.\n\n* docs(harmony): name the disclosure location for a nested child package\n\nThe unclassified-disclosure paragraph used \"there\" to refer back to a clause\nthat had just named `app_pack_children`, so a reader could take a nested `.hap`\nor `.hsp` member of a HAP or HSP root to be reported as an App Pack child. It is\nreported in `unclassified_components`: the child list is populated only for an\nApp Pack root. Names the location explicitly.", + "parents": ["b668cea2af0fa2608885563195eef6cdea0cb602"], + "authors": [ + { + "name": "Ace", + "email": "1160684883@qq.com", + "user": { + "login": "z2Ace0107", + "__typename": "User" + } + } + ], + "pullRequests": [4968] + }, + { + "sha": "54d819f3822cb67dcff121753840f8f014a4bc10", + "subject": "fix(javascript): emit no timer for a literal non-function callback (#8044)", + "body": "fix(javascript): emit no timer for a literal non-function callback (#8044)\n\n* fix(javascript): emit no timer for a literal non-function callback\n\nNode validates the timer callback before creating a handle:\n\n if (typeof callback !== 'function')\n throw new ERR_INVALID_ARG_TYPE('callback', 'function', callback);\n\nThe throw is synchronous, before any timer exists, but the analysis reported a\n`schedule` operation for such calls.\n\nMeasured on Node 24.22.1:\n\n setTimeout(\"code\", 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(`code`, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(1, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(1n, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(true, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(null, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(void 0, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout([], 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout({}, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout() -> THROWS ERR_INVALID_ARG_TYPE\n setImmediate(\"code\") -> THROWS ERR_INVALID_ARG_TYPE\n setInterval(\"code\", 0) -> THROWS ERR_INVALID_ARG_TYPE\n --- accepted by Node ---\n setTimeout(function(){}, 0) -> OK\n setTimeout(() => {}, 0) -> OK\n setTimeout(fn, 0) -> OK\n setTimeout(class {}, 0) -> OK (fails only when the class is invoked)\n\nSo a schedule is dropped only for an exactly readable literal that is not a\nfunction, or for a missing argument. An identifier, a call result or a spread may\nstill be a function at runtime and keeps its schedule.\n\n* chore: retrigger title and readiness checks after the title was corrected\n\n* fix(javascript): scope the timer callback rule to Node's timers module\n\ngreptile flagged two problems with the first version.\n\nP1 - browser timers disappeared. The rule was applied to bare globals, but\nbrowser and Electron renderer sources reach this analysis without a Node/browser\ndistinction, and there `setTimeout(\"refresh()\", 0)` is a real timer: the host\nevaluates the string. The rule now applies only when the timer is imported from\n`node:timers`, where that form cannot exist. A bare global schedule keeps its\nfact whatever argument 0 holds.\n\nP2 - unused import. `readExactJavaScriptLiteral` was imported but never used; the\nhelper reads shapes through `unwrapJavaScriptExpression`. Removed.\n\nMeasured on Node 24.22.1 (the throw is what makes a node:timers schedule\nimpossible; the bare-global case is intentionally left alone):\n\n import { setTimeout } from \"node:timers\";\n setTimeout(\"code\", 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(null, 0) -> THROWS ERR_INVALID_ARG_TYPE\n setTimeout(fn, 0) -> OK\n --- bare global, host may be a browser ---\n setTimeout(\"code\", 0) -> kept as a schedule\n\n24 cases cover both sides plus the cancellation link.\n\n* fix(javascript): reject every non-function global and unary timer callback\n\nReviewing the timer callback guard against Node 24.22.1 found two gaps. Both are\nin the same \"a call that always throws must not emit a resolved fact\" family.\n\n**An unmodified global that is not a function was accepted.** The guard read\nliteral nodes only, so a bare global identifier passed through even though Node\nrejects it before creating a handle:\n\n setTimeout(undefined) -> THREW ERR_INVALID_ARG_TYPE\n setTimeout(NaN) -> THREW ERR_INVALID_ARG_TYPE\n setTimeout(Infinity) -> THREW ERR_INVALID_ARG_TYPE\n\n`isUnmodifiedGlobalReference` keeps a shadowed binding out of the rule, so a\nlocal `const NaN = () => {}` keeps its schedule.\n\n**Only `void` was treated as a non-function unary operator.** Every unary operator\nyields a primitive, and Node rejects a primitive callback:\n\n setTimeout(!0) -> THREW ERR_INVALID_ARG_TYPE\n setTimeout(~0) -> THREW ERR_INVALID_ARG_TYPE\n setTimeout(-1) -> THREW ERR_INVALID_ARG_TYPE\n setTimeout(+\"1\") -> THREW ERR_INVALID_ARG_TYPE\n setTimeout(typeof 1) -> THREW ERR_INVALID_ARG_TYPE\n\nA class expression is still kept, because it passes Node's own `typeof` check and\nonly fails when invoked.\n\nFifteen regressions cover the rejected forms plus arrow, identifier, class,\nspread and shadowed-global cases; ten fail on the previous commit.\n\n* fix(javascript): let sloppy eval shadow the non-function global callback\n\nReview finding. The new global check read `undefined`, `NaN` and `Infinity` as\nunmodified globals, but sloppy `eval` can introduce a local function under one of\nthose names, which then shadows the global. Measured on Node 24.22.1 in script\nscope:\n\n function g() { eval(\"var undefined = () => {}\"); setTimeout(undefined, 0); }\n -> schedules a timer\n function g() { eval(\"var NaN = () => {}\"); setTimeout(NaN, 0); }\n -> schedules a timer\n\n`semanticOpaqueNameMayHaveChanged` now has to agree that no visible activation can\nintroduce such a name before the global reading is conclusive. In a module the\nsame `eval` is strict and introduces no outer binding, so the global reading still\nholds and the timer is still dropped.\n\nThree regressions cover the sloppy forms, and a fourth pins the no-eval cases as\nstill dropped. The three sloppy cases fail without the guard.", + "parents": ["848f16541746d11cf0ebd507f992b1c570128afb"], + "authors": [ + { + "name": "吴佳浩Alben", + "email": "35291372+XiaoBinGan@users.noreply.github.com", + "user": { + "login": "XiaoBinGan", + "__typename": "User" + } + } + ], + "pullRequests": [8044] + }, + { + "sha": "b9138a12613e35ad8df27015c495a6c112d0e537", + "subject": "fix(native): select versioned arm64e slices for codesign by family name (#8713)", + "body": "fix(native): select versioned arm64e slices for codesign by family name (#8713)\n\n* fix(native): select versioned arm64e slices for codesign by family name\n\nCurrent clang marks arm64e slices with pointer-authentication ABI\nversion 1 (subtype 0x81000002, lipo name arm64e.v1). The codesign\nselector table accepted only ABI version 0, so inspect-signature failed\nwith capability_unavailable whenever such a slice was selected, for\nexample on any universal arm64e + x86_64 binary built today.\n\ncodesign has no versioned name: -a arm64e.v1 is \"unknown architecture\nname\", and -a arm64e resolves to the first FAT slice with the arm64e\nbase subtype, whatever its ABI version. A selector is therefore exact\nonly for that first slice. Accept any versioned pointer-authentication\nABI for arm64e, and return a selector only when the slice is the first\nin table order to carry that name; a later slice sharing it stays\nunknown instead of being inspected through the earlier one. This also\nremoves the separate duplicate-name check from signature coverage.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(native): keep arm64e selectors unknown behind unmapped variants\n\ncodesign resolves a name to the first FAT slice with the same CPU type and\nbase subtype, so an earlier capability variant whose own name is unknown may\nshadow a later arm64e slice. Compare identities rather than successful name\nmappings.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 ", + "parents": ["54d819f3822cb67dcff121753840f8f014a4bc10"], + "authors": [ + { + "name": "Lewis Wang", + "email": "e1430629@u.nus.edu", + "user": { + "login": "Lew1sWong", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + } + ], + "pullRequests": [8713] + }, + { + "sha": "7570aabd9d484c41738461253f66d793c4fc766e", + "subject": "docs(skill): route SPA passive capture through allowed_origins (#7252)", + "body": "docs(skill): route SPA passive capture through allowed_origins (#7252)\n\nDefault page-origin scope excludes cross-origin APIs. Point agents at\nJavaScript analysis for API-origin discovery, require page origin plus API\norigins in allowed_origins (list replaces default), and bump the packaged\nskill to version 60.", + "parents": ["b9138a12613e35ad8df27015c495a6c112d0e537"], + "authors": [ + { + "name": "Beqa", + "email": "91750923+BeqaKs@users.noreply.github.com", + "user": { + "login": "BeqaKs", + "__typename": "User" + } + } + ], + "pullRequests": [7252] + }, + { + "sha": "1dc9e8774d15716d7fa523e8945f4508af7b4895", + "subject": "fix(cli): keep marker-only Markdown paragraph facts literal (#7813)", + "body": "fix(cli): keep marker-only Markdown paragraph facts literal (#7813)\n\nFixes #7634\n\nCo-authored-by: Abelo9996 ", + "parents": ["7570aabd9d484c41738461253f66d793c4fc766e"], + "authors": [ + { + "name": "Abel Yagubyan", + "email": "abelyagubyan@berkeley.edu", + "user": { + "login": "Abelo9996", + "__typename": "User" + } + }, + { + "name": "Abelo9996", + "email": "Abelo9996@users.noreply.github.com", + "user": { + "login": "Abelo9996", + "__typename": "User" + } + } + ], + "pullRequests": [7813] + }, + { + "sha": "09c889b3b5c6df26c47565cc1b8fcad8864c8710", + "subject": "test(javascript): cover Request endpoint identity and provenance (#6365)", + "body": "test(javascript): cover Request endpoint identity and provenance (#6365)\n\nfix(javascript): resolve inline Request URLs in fetch calls", + "parents": ["1dc9e8774d15716d7fa523e8945f4508af7b4895"], + "authors": [ + { + "name": "Mohamed Ayoub Eleuch", + "email": "58662566+AyoubElleuch@users.noreply.github.com", + "user": { + "login": "AyoubElleuch", + "__typename": "User" + } + } + ], + "pullRequests": [6365] + }, + { + "sha": "4d2aff2ec6eadb0e8dd475748a410ca0f3a37687", + "subject": "fix(mcp): report session tool target requirements accurately (#7340)", + "body": "fix(mcp): report session tool target requirements accurately (#7340)\n\n* fix(mcp): report session tool target requirements accurately\n\n- Declare requiresActiveTarget on inspect_address_context in sessionToolContracts.ts so closed-session discovery stops advertising an address query that fails with target_unavailable.\n\n- Route session-kind tools through targetAvailability in CapabilityInventory.ts before the available fallback, and report target_unsupported with mode-level remediation for get_navigation_context and inspect_address_context on artifact and archive targets.\n\n- Keep each navigation mode's missing_operations and remediation aligned with the target restriction so recommendations name the target instead of a provider.\n\n* test(mcp): cover closed-session and artifact target requirements\n\n- Add CapabilityInventory controls for closed-session address and explicit-path APK availability, artifact and archive restrictions with per-mode navigation flags, and structured reasons instead of pinned remediation sentences.\n\n- Add a production stdio MCP regression in sessionTargetRequirements.test.ts that observes both binary_session entries before and after the calls, the target_unavailable address error, the successful unsigned-ZIP APK call, and the sibling navigation prerequisite.", + "parents": ["09c889b3b5c6df26c47565cc1b8fcad8864c8710"], + "authors": [ + { + "name": "Akshad Jogi", + "email": "107343579+akshad-exe@users.noreply.github.com", + "user": { + "login": "akshad-exe", + "__typename": "User" + } + } + ], + "pullRequests": [7340] + }, + { + "sha": "ebea0f009ffc6353f0ae61254b1d2b5dcc4f08d2", + "subject": "fix(snapshot): retain one-shot Ghidra pseudocode results (#8089)", + "body": "fix(snapshot): retain one-shot Ghidra pseudocode results (#8089)\n\n* fix(snapshot): retain one-shot Ghidra pseudocode results\n\n* test(snapshot): cover evidence-only pseudocode migration\n\n---------\n\nCo-authored-by: hhang <169027046+xu91102@users.noreply.github.com>", + "parents": ["4d2aff2ec6eadb0e8dd475748a410ca0f3a37687"], + "authors": [ + { + "name": "hhang", + "email": "17309584214@163.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + }, + { + "name": "hhang", + "email": "169027046+xu91102@users.noreply.github.com", + "user": { + "login": "xu91102", + "__typename": "User" + } + } + ], + "pullRequests": [8089] + }, + { + "sha": "103684bce1971f25414f7e8dd879069720f6c315", + "subject": "fix(ghidra): guide recovery from unresolved procedure selectors (#8470)", + "body": "fix(ghidra): guide recovery from unresolved procedure selectors (#8470)\n\n* fix(ghidra): guide recovery from missing procedures\n\n* fix(ghidra): preserve mapped offset lookup recovery\n\n* fix(ghidra): distinguish unmapped procedure offsets\n\n* fix(ghidra): guide ambiguous selector recovery\n\n* fix(ghidra): clarify fresh import excludes project edits", + "parents": ["ebea0f009ffc6353f0ae61254b1d2b5dcc4f08d2"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8470] + }, + { + "sha": "398eb0d1f16b410b64a96615c6463fbf2ab2f38d", + "subject": "feat(setup): register LM Studio during setup (#8611)", + "body": "feat(setup): register LM Studio during setup (#8611)\n\n* feat(setup): register LM Studio during setup\n\nRegister rea in mcp.json in the LM Studio home through a new lm_studio\nclient. The home follows LM Studio's own lookup, read-only: the path in\n~/.lmstudio-home-pointer, else an existing ~/.cache/lm-studio, else\n~/.lmstudio. An unreadable or relative pointer reports a path error\ninstead of a guessed home.\n\nLM Studio parses mcp.json with strict JSON.parse, so comments, trailing\ncommas and a BOM are rejected before any backup or write. The entry\ncarries command, args and env with no type or timeout. Local models have\nsmall context windows, so the registration selects\nREA_MCP_INPUT_SCHEMA_PROFILE=compact unless a profile is set explicitly,\nand doctor reports an entry without a profile as stale. One predicate now\nowns that default for Kimi Code and LM Studio.\n\n* fix(doctor): resolve provider budgets for LM Studio as setup does", + "parents": ["103684bce1971f25414f7e8dd879069720f6c315"], + "authors": [ + { + "name": "Christopher Pruijsen", + "email": "christopher.pruijsen@gmail.com", + "user": { + "login": "cpruijsen", + "__typename": "User" + } + } + ], + "pullRequests": [8611] + }, + { + "sha": "abc647bf6cfe4b7f40343448faccf000adceec32", + "subject": "feat(desktop): suggest managed members for Unity script assemblies (#5511)", + "body": "feat(desktop): suggest managed members for Unity script assemblies (#5511)\n\n* feat(desktop): suggest managed members for Unity predefined script assemblies\n\nUnity Mono triage listed only inspect_managed_artifact probes, mostly for\nengine and framework assemblies. Assembly-CSharp.dll and\nAssembly-CSharp-firstpass.dll directly in a managed directory with a\nUnityEngine reference witness now get an inspect_managed_members probe,\nordered before every managed artifact probe.\n\n* docs(desktop): describe Unity Mono managed member probes\n\n* refactor(desktop): read Unity managed directory from the witness fact\n\n* refactor(desktop): reuse the managed directory index for predefined assemblies\n\n* feat(desktop): point Unity member probes at summary delivery first\n\n* test(desktop): no member probes without a Unity reference witness\n\n* docs(desktop): trim Unity member probe note\n\n* feat(desktop): suggest managed members in Unity IL2CPP backup folders\n\nUnity IL2CPP builds write _BackUpThisFolder_ButDontShipItWithYourGame\nnext to the player. When shipped, its Managed/ holds pre-IL2CPP assemblies.\nA path convention now records the folder on Assembly-CSharp*.dll directly in\nits Managed/, including when the admitted root is the folder itself, and\ntriage offers inspect_managed_members for those files. Correspondence to\nthe shipped native code stays unknown.\n\n* docs(desktop): note IL2CPP backup folder member probes\n\n* docs(desktop): list IL2CPP metadata versions 24 and 27 for the metadata probe\n\n* style(desktop): merge stacked doc comments on desktopPathConventions\n\n* test(desktop): cover member probes in a macOS bundle managed directory\n\n* docs(desktop): note that member probes need the game folder as root\n\n* test(desktop): no member probe when the root is the Unity data folder\n\n* test(desktop): check the data-folder root still gets managed probes\n\n* test(desktop): check the IL2CPP backup convention against the probe bound\n\n---------\n\nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["398eb0d1f16b410b64a96615c6463fbf2ab2f38d"], + "authors": [ + { + "name": "JANG BYUNGKUN", + "email": "bkbkjang@gmail.com", + "user": { + "login": "8rulerstar", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [5511] + }, + { + "sha": "61bb02d3df18b4271e283760b02c84c9c20a0358", + "subject": "fix(artifacts): keep inventorying an ASAR whose member declares an invalid size (#8719)", + "body": "fix(artifacts): keep inventorying an ASAR whose member declares an invalid size (#8719)\n\n* fix(artifacts): keep inventorying an ASAR whose member declares an invalid size\n\nA member whose declared size is not a non-negative safe integer, such as\nFigma Desktop's .codesign placeholder (size -1000), made readAsarListing\nthrow and failed inventory of the whole archive without naming the entry.\n\nListing now keeps such a member with a null size and a limitation naming\nthe parsed value, as it already keeps an unreadable offset. Opening a\npacked member with a null size raises ArtifactEntryContentUnavailable, so\ninventory records it as unavailable and continues with the other members.\nElectronFileScope keeps the strict size rule.\n\nMember metadata that still stops inventory now names the member and the\nrejected fields instead of reporting a generic malformed archive.\n\nFixes #8715\n\n* fix(artifacts): bound and preserve ASAR listing diagnostics\n\nQuote an unsafe path component or a string size through a 256-unit\nprefix plus its length, so one oversized header key cannot inflate the\nfailure or the retained limitation. Render numeric sizes with String so a\nsize that JSON.parse turned into Infinity is reported as Infinity rather\nthan null.\n\n* fix(artifacts): keep ASAR listing diagnostics exact and located\n\nReport a numeric size beyond the safe-integer range as having no\nretained exact value instead of the number JSON.parse rounded or\noverflowed, name object and array sizes correctly, and interpret each\ndeclared size once without validating absent directory sizes.\n\nQuote member and parent paths through the bounded source quote, name the\nrejected root fields as member failures already do, and append the\narchive path to listing failures so a nested archive stays identifiable.\n\n* test(artifacts): match ASAR listing archive paths that contain spaces", + "parents": ["abc647bf6cfe4b7f40343448faccf000adceec32"], + "authors": [ + { + "name": "김준호", + "email": "101695482+chordpli@users.noreply.github.com", + "user": { + "login": "chordpli", + "__typename": "User" + } + } + ], + "pullRequests": [8719] + }, + { + "sha": "e416ce1983a2276fb7fef4412c29c45b8c7a35c1", + "subject": "fix(cli): preserve Markdown validation error cells (#7978)", + "body": "fix(cli): preserve Markdown validation error cells (#7978)\n\nfix(cli): preserve markdown validation error cells", + "parents": ["61bb02d3df18b4271e283760b02c84c9c20a0358"], + "authors": [ + { + "name": "Wenyu Chiou", + "email": "162016108+WenyuChiou@users.noreply.github.com", + "user": { + "login": "WenyuChiou", + "__typename": "User" + } + } + ], + "pullRequests": [7978] + }, + { + "sha": "33e0bf101ab2afddc35da6dba985ab308dc504c9", + "subject": "fix(adb): admit completed path probes after daemon startup (#8858)", + "body": "fix(adb): admit completed path probes after daemon startup (#8858)\n\n* fix(adb): admit completed path probes after daemon startup\n\n* test(adb): preserve startup probe and digest evidence", + "parents": ["e416ce1983a2276fb7fef4412c29c45b8c7a35c1"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8858] + }, + { + "sha": "064bb3f713f6e948c28b40ac3bc2bbe8526085e6", + "subject": "fix(firmware): reject staged files cut off at the per-file limit (#4430)", + "body": "fix(firmware): reject staged files cut off at the per-file limit (#4430)\n\n* fix(firmware): keep producer reports writable under small staging budgets\n\nextract_firmware passed max_output_bytes straight to prlimit --fsize. RLIMIT_FSIZE\napplies to every regular file the producer writes, including the mandatory\nreport.json and unblob.log outside the staging tree, so a staging budget smaller\nthan the report truncated it and failed the extraction even when every staged\nfile fit. Derive the per-file ceiling as the larger of the staging budget and the\n8 MiB report budget; polling and the final inventory still enforce the aggregate\nstaging budget.\n\nFixes #3888\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(firmware): keep files stopped at the size ceiling over budget\n\nThe per-file RLIMIT_FSIZE ceiling equalled the largest size its readers\naccept, and both the staging inventory and the report reader accept a\nfile of exactly their budget. A write the kernel stopped at the ceiling\ntherefore left a truncated file that passed as complete. Raise the\nceiling by one byte so such a file exceeds its budget and is rejected.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(firmware): report the effective file-size ceiling on limit failures\n\nThe exit path re-derived the staging budget for SIGXFSZ and process-limit\nrecovery, so a small-budget run killed at the 8 MiB + 1 ceiling reported\nfile_size_bytes 64 and said the cap was max_output_bytes. Pass the\nceiling runFirmwareCommand installs and describe how it is derived.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(firmware): reject staged files cut off at the per-file limit\n\nRLIMIT_FSIZE stops a write at the limit without extending the file, and\nthe staging inventory admits a file of exactly max_output_bytes. With a\nbudget of 8 MiB or more the producer limit equalled the budget, so a\nstaged file the kernel cut short published as a complete extraction;\nan inherited ceiling below the budget did the same.\n\nDerive the per-run limit once in firmwareFileSizeLimit as one byte above\nthe largest budget, still capped by the inherited ceiling, so a file\nstopped at the limit exceeds its budget. When the inherited ceiling\nremoves that byte, both staging inventories refuse a regular file that\nreaches the installed limit with a nonretryable file-size constraint\nnaming the inherited limit.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* fix(firmware): derive limit adjustability from the per-run limit\n\nThe one byte of headroom makes the per-run file limit equal an\ninherited ceiling of exactly max_output_bytes + 1, but adjustability\nstill compared that ceiling with the raw budget. A SIGXFSZ then advised\nraising max_output_bytes, which the same ceiling clamps back to the\nsame limit.\n\nDecide adjustability in firmwareFileSizeAdjustable from\nfirmwareFileSizeLimit itself: recommend a larger budget only when it\nraises that limit.\n\nCo-Authored-By: Claude Opus 5.5 \n\n* test(firmware): compare file-size recovery with its owners\n\nThe SIGXFSZ adjustability cases and the inherited-ceiling workflow matched\nfragments of remediation prose, so a harmless rewrite would fail them.\nCompare the emitted guidance with firmwareSignalLimitError for the expected\nbranch, check that the two branches stay distinct, and compare the inventory\nrefusal with firmwareFileSizeLimitReached. The selected limit, resource and\nretryability stay asserted as structured facts.\n\nCo-Authored-By: Claude Opus 5.5 \n\n---------\n\nCo-authored-by: Claude Opus 5.5 \nCo-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>", + "parents": ["33e0bf101ab2afddc35da6dba985ab308dc504c9"], + "authors": [ + { + "name": "Paritosh Lahre", + "email": "155938586+SandstromPL@users.noreply.github.com", + "user": { + "login": "SandstromPL", + "__typename": "User" + } + }, + { + "name": "Claude Opus 5.5", + "email": "noreply@anthropic.com", + "user": { + "login": "claude", + "__typename": "User" + } + }, + { + "name": "gensokyo-dev", + "email": "342580529+gensokyo-dev@users.noreply.github.com", + "user": { + "login": "gensokyo-dev", + "__typename": "User" + } + } + ], + "pullRequests": [4430] + }, + { + "sha": "bd7002b4410486fe88d8c2da8104e0b91bd3f21f", + "subject": "fix(cli): export source Evidence for native value traces (#8297)", + "body": "fix(cli): export source Evidence for native value traces (#8297)\n\n* fix(cli): export source Evidence for native value traces\n\n* fix(cli): export source Evidence for native value traces\n\n* fix(cli): preserve trace completeness in summaries", + "parents": ["064bb3f713f6e948c28b40ac3bc2bbe8526085e6"], + "authors": [ + { + "name": "Ha1baraA1", + "email": "243105435+Ha1baraA11@users.noreply.github.com", + "user": { + "login": "Ha1baraA11", + "__typename": "User" + } + } + ], + "pullRequests": [8297] + }, + { + "sha": "85be0f70a69a3a0ae7ea3a965f9c3621ebdb4b9e", + "subject": "fix(artifacts): guide retries for symlinked files (#8725)", + "body": "fix(artifacts): guide retries for symlinked files (#8725)\n\n* fix(go): suggest resolved path for rejected symlinks\n\n* test(go): cover unresolved symlink recovery paths\n\n* fix(go): omit schema recovery for resolved symlinks\n\n* fix(artifacts): share resolved-path recovery across inspectors\n\n* fix(sqlite): retain resolved database path through snapshot reads\n\n* fix(captures): retain symlink retry guidance\n\n* fix(artifacts): preserve retry hints through redaction and selected reads\n\n---------\n\nCo-authored-by: dhruvac29 ", + "parents": ["bd7002b4410486fe88d8c2da8104e0b91bd3f21f"], + "authors": [ + { + "name": "Dhruvilkumar Ashokbhai Chodvadiya", + "email": "50516925+dhruvac29@users.noreply.github.com", + "user": { + "login": "dhruvac29", + "__typename": "User" + } + }, + { + "name": "dhruvac29", + "email": "dhruvac29@users.noreply.github.com", + "user": { + "login": "dhruvac29", + "__typename": "User" + } + } + ], + "pullRequests": [8725] + }, + { + "sha": "2d16a40a491067ef0bbe541feef2feeb5f3110ad", + "subject": "fix(ghidra): report selected project identity failures (#8379)", + "body": "fix(ghidra): report selected project identity failures (#8379)\n\n* fix(ghidra): report selected project identity failures\n\n* fix(ghidra): retain refusal until client shutdown", + "parents": ["85be0f70a69a3a0ae7ea3a965f9c3621ebdb4b9e"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + } + ], + "pullRequests": [8379] + }, + { + "sha": "89317a39fab23df81efa4331311d09d2110377bd", + "subject": "fix(javascript): remove duplicate childNodes import (#8886)", + "body": "fix(javascript): remove duplicate childNodes import (#8886)\n\n* fix(javascript): remove duplicate childNodes import\n\nThe squash of #7967 re-added the import already introduced in afc18131f,\nso typecheck failed with TS2300.\n\n* test(gdb): expect the command-output cap limitation\n\nThe retained-record limitation now names the command-output setting.\nThe coverage assertion still required the previous fixed-cap sentence.\n\n* test(cli): keep rejected mcp add values off Amp settings\n\nmcp add now rejects a flag in the --command value position. The Amp\nregistration test still treated that invocation as a successful selection.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["2d16a40a491067ef0bbe541feef2feeb5f3110ad"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8886] + }, + { + "sha": "c13dd36d9508e3b05b51340eb8188391c9fe08dd", + "subject": "fix(artifacts): decide how compare_artifacts compares every format_metadata kind (#8231)", + "body": "fix(artifacts): decide how compare_artifacts compares every format_metadata kind (#8231)\n\n* feat(artifacts): inventory and extract ESP32 firmware images\n\nESP32-family app and bootloader images (magic 0xE9) had no reader, so\nopen_binary refused OTA downloads, app partitions and bootloaders.\n\nAdd the esp-image container format behind inspect_artifact and\nextract_artifact. A pure decoder reads each byte once and keeps only\nfixed-size fields. Derived facts cover the chip, from a table cited to\nESP-IDF v6.1; segment classification as ESP-IDF's should_map and\nshould_load; checksum and appended SHA-256 results; app and bootloader\ndescriptors; Secure Boot v2 signature blocks, observed and unverified;\nand undescribed trailing byte ranges. Truncation and undescribed bytes\nmake coverage unknown. ESP8266 images are refused with a specific\nreason, and ciphertext stays unrecognized.\n\nAdd the format to every target, Evidence, snapshot, live-summary and\nartifact vocabulary, document it, and add an optional verify:esp-images\nlane that compares esptool-built images with esptool image-info and\nespsecure signature-info-v2.\n\nRefs #3615\n\n* test(artifacts): run the ESP image lane on esptool v5.6.0\n\nThe lane compared descriptor fields only when esptool image-info printed\none, so a descriptor that REA reports and esptool does not print passed\nwithout comparison. Compare the descriptor kind in both directions.\n\nRecord that the lane passed for all 13 images with esptool and espsecure\nv5.6.0, the version the layout facts cite, as well as with 4.12.0.\n\n* refactor(artifacts): define ESP image layout sizes once\n\nThe decoder and the derived facts each defined the segment-header,\nappended-digest and flash-sector sizes, the erased-byte scan and the\noffset formatter. Define them once with the other fixed-layout structures\nand import them in both places. The signature slot count is the one\nconstant that drives the slot scan.\n\nCorrect the observedEnd comment: it is the end of the last chunk read.\n\n* fix(artifacts): report ESP-IDF's segment length limit by chip\n\nESP-IDF's verify_segment_header rejects a segment of 16 MiB or more\nunless the chip maps flash through 32-bit cache addresses\n(SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP: ESP32-S3, P4, C5, C61, H4 and\nS31 in v6.1). Record that capability in the chip table and add a\nlimitation for such segments; unknown chips get none.\n\n`loaded` repeats should_load. It does not mean the bootloader accepts the\nsegment: verify_load_addresses still rejects one outside the chip's RAM,\nwhich REA does not model. Say so in the docs, the skill reference and the\ninventory limitation.\n\n* test(artifacts): check ESP lane tools first and verify extraction\n\nThe lane started work before checking its tools, so a missing RISC-V\ntarget, ld.lld, esptool or espsecure surfaced as a raw spawn or command\nerror. Check each one before building and name the variable to set. Warn\nwhen esptool is not v5.6.0, the release the layout facts cite.\n\nAssert each segment's class for the ESP32-C3 app, its variants and the\nbootloader, as the Xtensa image already did. Extract the app and the\nsigned image through the CLI and compare every file with the bytes at\nesptool's segment offsets or in the appended signature sector; the\nsource's SHA-256 must be unchanged and equal the reported root_sha256.\n\n* docs(artifacts): state what the ESP image lane does not establish\n\nThe Verification section listed the lane's checks but not its gaps: only\nESP32-C3 and ESP32 images come from a real producer, no real project\nbuild, OTA download or flash dump is inspected, no signature is verified,\nand the lane does not run in CI.\n\nRecord the timing of the final lane run on esptool v5.6.0.\n\n* fix(artifacts): compare ESP segment declarations\n\nSegment entries hash only their data, so compare_artifacts reported a\nsegment that moved to another load address with the same bytes as\nunchanged; only the image itself changed. Compare each segment's\nload_addr and data_len as its declaration, as Node SEA and PyInstaller\nmembers are compared, and count a changed declaration as a metadata\nchange, also when content is unavailable.\n\nHeader offsets are layout and the classification is derived, so neither\nis compared.\n\n* test(artifacts): run ESP lane commands as owned process trees\n\nThe lane ran its tools through execFile. A timeout killed only the direct\nchild, so a linker or assembler that Clang or GCC had started could keep\nrunning while the lane removed its workspace. Run every command through\ncreateVerifierCommands, check the tools inside withVerifierCleanup, and\nremove the workspace only after commands.close() has stopped every tree;\na failed close keeps the workspace.\n\nOnly a nonzero exit now counts as a refusal or an expected esptool\nfailure; timeouts and spawn failures propagate. Supervising each command\nroughly doubles the lane's run time.\n\n* test(artifacts): cancel ESP decoding after its first decoded chunk\n\nThe cancellation test requested cancel or close on setImmediate, which\ncan land while the file is still being opened and checked, so it never\nshowed that decoding had started. It also passed against a reader that\nignored both requests while decoding. Acknowledge the decoder's first\nchunk, then cancel or close, join the operation, and assert that no\nlater chunk reaches the decoder and that the reader ends closed.\n\n* docs(artifacts): record which ESP metadata comparison ignores\n\nSegments are compared by their declaration. The image's and the\nsignature blocks' format_metadata are not: every field comes from their\nown bytes, which content comparison already covers, and a block's\nimage_digest_matches follows the image's content.\n\n* fix(artifacts): decide declaration comparison for every metadata kind\n\ncompare_artifacts listed the format_metadata kinds it compared by hand,\nso a new kind went uncompared without notice; ESP segment load addresses\nwere first missed this way. One table beside the schemas now gives every\nkind a declaration projection or the reason comparison uses none of its\nfacts, and a kind without an entry does not compile. Consumers read one\nresult per pair instead of naming formats.\n\n- Godot PCK entries stay uncompared. Godot looks members up by the\n simplified path without res://, which logical_path holds apart from\n Unicode normalization. Godot 4.3 exports store res:// and 4.4.1\n exports do not, so comparing source_path would mark every member\n changed. The reader admits only the encryption flag, which the\n occurrence's encrypted field records.\n- A changed PyInstaller declaration is now a metadata change also when\n the member's content is unavailable, as for ASAR, Node SEA and ESP\n segments. It was unknown before, for no recorded reason.\n- Root kinds and ESP signature blocks stay uncompared: their fields come\n from their own bytes, which content comparison covers.\n- A declaration that only one side records now adds one generic\n limitation for every compared kind. Only Node SEA added one before,\n with its own text.\n\n* fix(artifacts): keep content comparison for metadata records with content\n\nThe record rule compared two metadata occurrences by their declaration\nalone. A hand-built record that names content, with an equal declaration,\nthen hid a content change; PyInstaller records already did so before the\ntable. The rule now needs both records without an artifact_id, which is\nevery metadata record a reader emits.\n\nReview changes in the same area:\n\n- The unknown-declaration limitation also covers declarations of different\n kinds and non-container observations, and tests compare it with its\n constant.\n- docs/godot-pck.md gives each Godot version's lookup path, the backslash\n case, and that a member that becomes encrypted compares unknown. The\n table points to it instead of restating it.\n- The PyInstaller regression moves to an acceptance test whose MCP client\n validates the advertised output schema, and the domain tests keep one\n representative case per behavior.\n\n* fix(artifacts): compare encryption changes when content is unavailable\n\nAn encrypted member has no content. Comparison then took the\ncontent-unavailable fallback, which counted only ASAR storage and format\ndeclarations, so a Godot PCK, ZIP or PYZ member that became encrypted\ncompared unknown although both sides record `encrypted`. The record rule\ncompared node-less metadata records by format declaration alone, so a PYZ\nnamespace record whose encryption flipped compared unchanged.\n\n`OccurrenceMetadata` now owns the encryption comparison beside ASAR\nstorage and the format declaration. Every occurrence records `encrypted`,\nso a pair's comparison is never unknown. The fallback, the record rule and\nthe metadata dimension read it there; `metadataChanged` no longer compares\n`encrypted` itself. The record rule compares all of `OccurrenceMetadata`:\na changed value is changed in metadata, with availability when another is\nunknown.\n\nDecision: occurrence limitations still do not count for node-less\nrecords. Readers derive them from the declared facts (the PYZ caveat\nfollows `encrypted`), and their wording can change between REA versions\nwhile the record stays the same. The fallback does not compare them\neither.\n\nBehavior changes:\n- A pair with unavailable content whose `encrypted` differs is changed\n [metadata, availability], not unknown [availability].\n- A node-less record whose `encrypted` differs is changed [metadata], not\n unchanged.\n- A hand-built node-less record that records ASAR storage now compares\n it; no reader emits such records.\n\nRemaining:\n- The fallback still ignores `entry_kind` and `executable`, which readers\n also declare, so a file that becomes a symlink, or a mode change on an\n encrypted ZIP member, still compares unknown. `executable` has its own\n dimension, so its fix needs content-free checks split from node checks.\n Each is its own behavior decision.\n- Node-bearing pairs still compare limitation wording; records do not.\n Whether limitation wording is ever a comparison fact needs one decision.\n\n* fix(artifacts): compare entry kind and executable when content is unavailable\n\nWhen either side lacked verified content, comparison took a fallback that\ncounted only ASAR storage, encryption and format declarations. It compared\n`entry_kind` only in the metadata check of pairs with content, and\n`executable` only beside the node checks. A ZIP member that became a\nsymlink, whose target REA does not read, and an encrypted ZIP member whose\nUnix mode gained an execute bit therefore compared unknown, although\nreaders declare both fields on every occurrence.\n\n`OccurrenceMetadata` now owns the entry kind comparison beside encryption;\nit is never unknown. Comparison checks fall into two groups: declared facts\nthat need no content (`executable` and the metadata declarations), and\nfacts that need both content nodes (content, kind, format, size, relations\nand node metadata). The fallback, the record rule and pairs with content\nshare the declared checks and one rule for unknown declarations. Kind and\nformat stay content checks: without content they are guesses from the path.\n\nBehavior changes:\n- Unless both sides have content, a pair whose entry kind differs is\n changed [metadata, availability], not unknown [availability].\n- Such a pair whose `executable` differs is changed [executable,\n availability], with metadata when another declared fact also differs.\n- A hand-built node-less record whose `executable` differs is changed\n [executable]. No reader emits such records.\n\nRemaining: declared sizes and integrity digests still compare only through\nobserved bytes, so they do not count when content is unavailable.\n\n* fix(artifacts): never mark a symlink executable\n\nOn POSIX hosts the directory reader recorded a symlink's own permission\nbits as `executable`. Linux reports 0777 for every symlink and macOS\nusually 0755, so directory, app bundle and DMG symlinks read true. zip.js,\nthe PyInstaller reader and the Windows branch record false. The previous\ncommit compares `executable` without content, so a symlink that two\nreaders or two hosts record differently compared changed in `executable`,\nand a non-executable file that became a symlink also reported `executable`.\n\n`hostExecutableMarking` now gives a symlink no marking on any host:\nrunning a symlink runs its target, and the link's own bits do not control\nthat.\n\nBehavior change: directory, app bundle and DMG inventories record\n`executable: false` for symlinks. Occurrence IDs do not change, but the\ngraph digests and manifest IDs of inventories with symlinks do. Comparing\nan inventory stored before this change with a new one therefore reports\nchanged [executable, availability] once for each such symlink.\n\n* fix(artifacts): stop comparing limitation wording\n\nPairs with content compared node and occurrence limitations as metadata,\nwhile node-less records, the content-unavailable fallback and inventory\nlimitations did not. Limitations explain what an observation could\nestablish. Readers mostly derive them from fields that comparison already\nreads, from other occurrences or from what REA could read, and their\nwording changes between REA versions. So adding `A` beside an unchanged\nZIP member `a` marked `a` changed in metadata through its case-collision\nnote, and an older and a newer inventory of equal bytes could differ\nwherever a reader reworded a note.\n\nNo comparison path reads limitations now. Inventory limitations still\nappear in the result, and occurrence limitations stay in the inventory\nEvidence. Readers write no node limitations, so only hand-built inventories\ncompared them.\n\nBehavior change: for a pair with content, limitation text no longer adds\nmetadata. A pair that differs only there compares unchanged, or unknown\n[availability] when a declaration is unknown.\n\nRemaining: a few facts appear only in limitation text, or also in fields\nthat comparison does not read, so their changes are no longer reported\nwhile the compared bytes stay equal: an ASAR block integrity table or an\nunsupported integrity declaration, a Godot member's all-zero MD5, a ZIP\nname's leading `./` (also in `source_path`), and a PyInstaller PYZ image\ndigest (also in `pyz_sha256`; the archive root still reports the change).\nEach needs a field or a comparison decision of its own if it matters.\n\n* fix(artifacts): compare declared digests when content is unavailable\n\nWithout observed bytes on both sides, comparison ignored the containers'\ndeclared integrity claims. Two encrypted Godot PCK members therefore\ncompared unknown even when their declared MD5s showed that the script had\nchanged. Godot's exporter stores the MD5 of a member's original bytes, so\nthe MD5 does not depend on the encryption IV. This comes from the 4.3,\n4.4.1 and 4.7.1 exporter sources; no real encrypted export was compared.\n\nWhen either side has no content, claims of one algorithm that differ now\nmake the path changed in metadata and availability. Equal claims add no\nchange, because they are unverified, and observed bytes still decide when\nboth sides have them. Godot PCK and ASAR readers record such claims.\n\nFor a readable member, a directory that declares or omits an MD5 only\ndecides whether REA can check its bytes, so such a member compares\nunchanged. An encrypted member with an MD5 on only one side stays unknown.\n\nRemaining: declared sizes still compare only through observed bytes.\n\n* docs(artifacts): check the contract's compared kinds against the table\n\ndocs/mcp-contracts.md named the format_metadata kinds that\ncompare_artifacts compares in prose, by hand, so a kind added to the\ndeclaration table could go unnamed. The integration branch already omits\nesp-flash-partition, which the ESP flash layout branch adds to the table.\n\nThe paragraph now names each compared kind by its identifier. A\nconformance test requires it to name exactly the kinds whose table entry\nhas a declaration, which artifactFormatMetadata.ts exports as\nCOMPARED_FORMAT_METADATA_KINDS, and no kind that comparison ignores.\n\n* test(artifacts): share the comparison acceptance MCP fixture\n\nSix artifact comparison acceptance tests each copied the same MCP\nsteps: open_binary, inspect_artifact, the inventory_artifact substep\nEvidence, then compare_artifacts. The coverage test repeated the\ninspect steps three times and kept its own inventory lookup.\n\ntests/fixtures/artifactComparisonMcp.ts now owns these steps on the\nschema-validating connectLocalToolsMcp client.\nconnectArtifactComparisonMcp() returns call, inspect(path) and\ncompare(left, right). inventoryEvidence() reads the inventory Evidence\nthat an inspection retains, from MCP or CLI output. Each test still\nwrites its own authored input and keeps its expectations.\n\nThe coverage lookup matched evidence.operation, not the substep\noperation. The inspection schema fixes both to inventory_artifact, so\nboth select the same substep.\n\nThe plist acceptance test does not change. It compares the inspection\nEvidence itself across CLI and MCP and passes the comparison Evidence\nto verify_reconstruction and find_changed_behavior.\n\nNo assertion or scenario changes.\n\n* fix(artifacts): leave .NET bundle member declarations uncompared\n\nUpstream main compares no .NET bundle member facts. Comparing `file_type`\nchanged `compare_artifacts` output beyond this branch's fixes, so the kind\nstays uncompared until that is decided. A changed manifest still shows as a\ncontent change of the host.\n\n* fix(artifacts): leave HEX region declarations uncompared\n\nThe comparison table compared a region's start_address and length. A\nregion's path names its start and end addresses, and its length follows\nfrom them, so two regions that pair at one path always declare the same\nfacts: the entry could never find a change. It only made a region with\nequal bytes unknown when the other side recorded no metadata, such as a\ndirectory of extracted regions. The kind is not compared, as on main.\n\nThe contract paragraph also stops naming .NET bundle members, which\n3e51a7760 left uncompared.\n\n* test(artifacts): compare node-less records of any compared kind\n\nThe record rule follows the comparison table, not PyInstaller, but only\nPyInstaller records exercised it. An ESP segment record shows both\noutcomes: an equal declaration compares unchanged and a moved one changed\nin metadata, without the availability that the fallback for unread\ncontent would add.\n\n* test(artifacts): compare a node-less record's recorded ASAR storage\n\nThe record rule compares ASAR storage beside the declaration and\n`encrypted`, but no test recorded it on a metadata record. A changed\nvalue is changed in metadata, and a value that only one side records\nis unknown in availability, as for any occurrence.\n\n* test(artifacts): compare UnityFS member declarations through MCP\n\nThe table compares a UnityFS member's declared source_path and raw\nflags, but no comparison test covered the kind, so dropping either field\nfrom the projection left every test passing. Bundles with equal member\nbytes now show both: other flags, or a stored path in decomposed form,\ncompare changed in metadata, and reordered members, whose index and\nstream offset are layout, compare unchanged.\n\n* test(artifacts): use the shared comparison fixture for UnityFS\n\nThe UnityFS comparison test arrived from the bottom branch with its own\ncopy of the open_binary, inspect_artifact and compare_artifacts steps,\nwhich tests/fixtures/artifactComparisonMcp.ts owns here. It now uses\nconnectArtifactComparisonMcp() like the other comparison acceptance\ntests. No assertion changes.\n\n* test(artifacts): find the contract's compared kinds by marker\n\nThe docs conformance test found its paragraph by an exact English phrase,\nso rewording \"also compares\" failed it while the named kinds stayed\nright. The paragraph now sits between BEGIN and END markers, as the\nallocation report's sections do, and the test reads the kinds between\nthem. It still requires exactly the kinds whose table entry has a\ndeclaration.", + "parents": ["89317a39fab23df81efa4331311d09d2110377bd"], + "authors": [ + { + "name": "Entrpi", + "email": "133157614+Entrpi@users.noreply.github.com", + "user": { + "login": "Entrpi", + "__typename": "User" + } + } + ], + "pullRequests": [8231] + }, + { + "sha": "b1b6cb64c2c9b0765e0ff6d6f48740140767d5fd", + "subject": "fix(analysis-view)!: distinguish unavailable native collections (#8291)", + "body": "fix(analysis-view)!: distinguish unavailable native collections (#8291)", + "parents": ["c13dd36d9508e3b05b51340eb8188391c9fe08dd"], + "authors": [ + { + "name": "星闌", + "email": "130824939+Xinglan233@users.noreply.github.com", + "user": { + "login": "Xinglan233", + "__typename": "User" + } + } + ], + "pullRequests": [8291] + }, + { + "sha": "30a11af92362ff34d716eefd34658ce49b3beca7", + "subject": "fix(browser)!: keep the Chromium sandbox for REA-launched browsers (#8738)", + "body": "fix(browser)!: keep the Chromium sandbox for REA-launched browsers (#8738)\n\n* fix(browser)!: keep the Chromium sandbox for REA-launched browsers\n\nPlaywright appends --no-sandbox unless a launch passes\nchromiumSandbox: true. Neither the browser scenario launch nor the native\nmodule resolver passed it, so every REA-launched Chromium ran without its\nsandbox and REA_BROWSER_NO_SANDBOX had no effect.\n\nBoth launch sites now take the sandbox decision from ChromiumSandbox.ts:\noff on Android or when REA_BROWSER_NO_SANDBOX=true, on otherwise. When\nChromium reports that it cannot start its sandbox, the launch failure's\nremediation names the opt-out.\n\nFixes #8722\n\nBREAKING CHANGE: hosts where Chromium cannot create its sandbox, such as\nroot users and Linux containers without user namespaces or a setuid\nsandbox, now fail to launch until REA_BROWSER_NO_SANDBOX=true is set.\n\n* fix(browser): name the sandbox opt-out on any sandboxed launch failure\n\nChromium reports an unusable sandbox through several unrelated startup\nmessages, including a misconfigured setuid helper and a refused namespace\nmove, and Playwright recognizes only some of them. Matching individual\nmessages missed real failures, so a sandboxed launch failure now always\nnames REA_BROWSER_NO_SANDBOX=true as a conditional remediation and the\nretained startup diagnostics show whether the sandbox was the cause.\n\n* fix(browser): keep default recovery for resolver failures after launch\n\nThe module resolver's outer catch also covers context, navigation and\nevaluation failures after the browser launched. Attaching the sandbox\nremediation there replaced their default recovery guidance. Attach the\nshared launch remediation only when a sandboxed launch itself fails.\n\n* docs(browser): note the Android sandbox exception for module traces", + "parents": ["b1b6cb64c2c9b0765e0ff6d6f48740140767d5fd"], + "authors": [ + { + "name": "김준호", + "email": "101695482+chordpli@users.noreply.github.com", + "user": { + "login": "chordpli", + "__typename": "User" + } + } + ], + "pullRequests": [8738] + }, + { + "sha": "25b62db838bca5305ef540ae33980778b0918017", + "subject": "test(firmware): cover S-record high address workflows (#8897)", + "body": "test(firmware): cover S-record high address workflows (#8897)", + "parents": ["30a11af92362ff34d716eefd34658ce49b3beca7"], + "authors": [ + { + "name": "ShuaixinHuang", + "email": "1836656514@qq.com", + "user": { + "login": "ShuaixinHuang", + "__typename": "User" + } + } + ], + "pullRequests": [8897] + }, + { + "sha": "52bca6de410da5ea6022ad9d351f9ba67ad6074f", + "subject": "fix(native): retain value trace source evidence (#8384)", + "body": "fix(native): retain value trace source evidence (#8384)\n\n* fix(native): retain value trace source evidence\n\n* fix(native): build trace error evidence only on failure\n\n* test(mcp): expect unowned value trace refusal\n\n* test(mcp): avoid freezing trace error wording\n\n* test(native): keep value-trace stop coverage with source evidence\n\nMain's stop and continuation cases now meet the trace's evidence-owner\nprecondition: direct calls supply a source id, and a completed MCP trace\nruns in a session that can retain it.\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["25b62db838bca5305ef540ae33980778b0918017"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8384] + }, + { + "sha": "63b66fa4981ee7688ac39492bca29ff89d0b120e", + "subject": "fix(search): clarify regex diagnostics and recovery (#8776)", + "body": "fix(search): clarify regex diagnostics and recovery (#8776)\n\n* fix(ghidra): identify invalid regex patterns\n\n* docs(native): clarify regex dialects in search contracts\n\n* fix(ghidra): guide regex syntax recovery\n\n* fix(search): guide regex worker recovery\n\n* fix(search): preserve regex parser diagnostics\n\n* test(search): update regex boundary expectations\n\n* refactor(search): remove unused regex error hook\n\n---------\n\nCo-authored-by: Cursor Agent ", + "parents": ["52bca6de410da5ea6022ad9d351f9ba67ad6074f"], + "authors": [ + { + "name": "morluto", + "email": "76467478+morluto@users.noreply.github.com", + "user": { + "login": "morluto", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8776] + }, + { + "sha": "5990ff0324de38042ea95ecdf5c369b295aa4bbd", + "subject": "feat(artifacts): read WeChat mini-program wxapkg containers (#8148)", + "body": "feat(artifacts): read WeChat mini-program wxapkg containers (#8148)\n\n* feat(artifacts): read WeChat mini-program wxapkg containers\n\nAdd a read-only reader for plaintext wxapkg packages: the 0xBE/0xED\n18-byte big-endian header, the bounded name/offset/size member table,\nand verbatim member bytes at absolute carrier offsets.\n\n- Members retain declared names, absolute offsets and sizes, so\n source_location reports real carrier positions.\n- V1MMWX PC-client packages are detected as encrypted coverage with\n null member facts; extraction refuses with a typed error and no\n decryption is attempted.\n- Bounded table and directory budgets are admitted before allocation;\n malformed marks, truncated tables, invalid UTF-8 names, member\n extents inside the header or beyond the file, and counts that cannot\n fit their table are typed format or limit failures.\n- Member reads stream in bounded 64 KiB chunks with carrier freshness\n checks; the reader joins outstanding streams before close and bounds\n active streams and repeated member I/O.\n\nRefs #8121.\n\nGenerated with [Devin](https://devin.ai)\n\nCo-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>\n\n* fix(artifacts): bound wxapkg members to the declared data region\n\nNormalize the two indexLength conventions before the table bounds check\nand the table read. Member ranges must then lie in that declared data\nregion, which has to fit in the file.\n\nRecord wxapkg format metadata as not compared: header facts repeat the\npackage bytes, and entry source paths keep a producer root prefix.\n\n* fix(artifacts): choose the wxapkg index after member ranges fit\n\nFour trailing bytes made the rows-only layout end on the file and dropped\nthe count-inclusive layout. Keep every admitted layout until the parsed\nrows and member ranges select one.\n\n---------\n\nCo-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>\nCo-authored-by: Cursor Agent ", + "parents": ["63b66fa4981ee7688ac39492bca29ff89d0b120e"], + "authors": [ + { + "name": "blankym", + "email": "yanming@metasota.ai", + "user": { + "login": "blankym", + "__typename": "User" + } + }, + { + "name": "Devin", + "email": "158243242+devin-ai-integration[bot]@users.noreply.github.com", + "user": { + "login": "devin-ai-integration[bot]", + "__typename": "User" + } + }, + { + "name": "Cursor Agent", + "email": "cursoragent@cursor.com", + "user": { + "login": "cursoragent", + "__typename": "User" + } + } + ], + "pullRequests": [8148] + }, + { + "sha": "0a99c2a5809fb1db8ca3ed58ece6ce69cbb8afe5", + "subject": "fix(artifacts): give Godot PCK and Node SEA readers the ESP member lifecycle (#8395)", + "body": "fix(artifacts): give Godot PCK and Node SEA readers the ESP member lifecycle (#8395)\n\n* feat(artifacts): inventory and extract ESP32 firmware images\n\nESP32-family app and bootloader images (magic 0xE9) had no reader, so\nopen_binary refused OTA downloads, app partitions and bootloaders.\n\nAdd the esp-image container format behind inspect_artifact and\nextract_artifact. A pure decoder reads each byte once and keeps only\nfixed-size fields. Derived facts cover the chip, from a table cited to\nESP-IDF v6.1; segment classification as ESP-IDF's should_map and\nshould_load; checksum and appended SHA-256 results; app and bootloader\ndescriptors; Secure Boot v2 signature blocks, observed and unverified;\nand undescribed trailing byte ranges. Truncation and undescribed bytes\nmake coverage unknown. ESP8266 images are refused with a specific\nreason, and ciphertext stays unrecognized.\n\nAdd the format to every target, Evidence, snapshot, live-summary and\nartifact vocabulary, document it, and add an optional verify:esp-images\nlane that compares esptool-built images with esptool image-info and\nespsecure signature-info-v2.\n\nRefs #3615\n\n* test(artifacts): run the ESP image lane on esptool v5.6.0\n\nThe lane compared descriptor fields only when esptool image-info printed\none, so a descriptor that REA reports and esptool does not print passed\nwithout comparison. Compare the descriptor kind in both directions.\n\nRecord that the lane passed for all 13 images with esptool and espsecure\nv5.6.0, the version the layout facts cite, as well as with 4.12.0.\n\n* refactor(artifacts): define ESP image layout sizes once\n\nThe decoder and the derived facts each defined the segment-header,\nappended-digest and flash-sector sizes, the erased-byte scan and the\noffset formatter. Define them once with the other fixed-layout structures\nand import them in both places. The signature slot count is the one\nconstant that drives the slot scan.\n\nCorrect the observedEnd comment: it is the end of the last chunk read.\n\n* fix(artifacts): report ESP-IDF's segment length limit by chip\n\nESP-IDF's verify_segment_header rejects a segment of 16 MiB or more\nunless the chip maps flash through 32-bit cache addresses\n(SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP: ESP32-S3, P4, C5, C61, H4 and\nS31 in v6.1). Record that capability in the chip table and add a\nlimitation for such segments; unknown chips get none.\n\n`loaded` repeats should_load. It does not mean the bootloader accepts the\nsegment: verify_load_addresses still rejects one outside the chip's RAM,\nwhich REA does not model. Say so in the docs, the skill reference and the\ninventory limitation.\n\n* test(artifacts): check ESP lane tools first and verify extraction\n\nThe lane started work before checking its tools, so a missing RISC-V\ntarget, ld.lld, esptool or espsecure surfaced as a raw spawn or command\nerror. Check each one before building and name the variable to set. Warn\nwhen esptool is not v5.6.0, the release the layout facts cite.\n\nAssert each segment's class for the ESP32-C3 app, its variants and the\nbootloader, as the Xtensa image already did. Extract the app and the\nsigned image through the CLI and compare every file with the bytes at\nesptool's segment offsets or in the appended signature sector; the\nsource's SHA-256 must be unchanged and equal the reported root_sha256.\n\n* docs(artifacts): state what the ESP image lane does not establish\n\nThe Verification section listed the lane's checks but not its gaps: only\nESP32-C3 and ESP32 images come from a real producer, no real project\nbuild, OTA download or flash dump is inspected, no signature is verified,\nand the lane does not run in CI.\n\nRecord the timing of the final lane run on esptool v5.6.0.\n\n* fix(artifacts): compare ESP segment declarations\n\nSegment entries hash only their data, so compare_artifacts reported a\nsegment that moved to another load address with the same bytes as\nunchanged; only the image itself changed. Compare each segment's\nload_addr and data_len as its declaration, as Node SEA and PyInstaller\nmembers are compared, and count a changed declaration as a metadata\nchange, also when content is unavailable.\n\nHeader offsets are layout and the classification is derived, so neither\nis compared.\n\n* test(artifacts): run ESP lane commands as owned process trees\n\nThe lane ran its tools through execFile. A timeout killed only the direct\nchild, so a linker or assembler that Clang or GCC had started could keep\nrunning while the lane removed its workspace. Run every command through\ncreateVerifierCommands, check the tools inside withVerifierCleanup, and\nremove the workspace only after commands.close() has stopped every tree;\na failed close keeps the workspace.\n\nOnly a nonzero exit now counts as a refusal or an expected esptool\nfailure; timeouts and spawn failures propagate. Supervising each command\nroughly doubles the lane's run time.\n\n* test(artifacts): cancel ESP decoding after its first decoded chunk\n\nThe cancellation test requested cancel or close on setImmediate, which\ncan land while the file is still being opened and checked, so it never\nshowed that decoding had started. It also passed against a reader that\nignored both requests while decoding. Acknowledge the decoder's first\nchunk, then cancel or close, join the operation, and assert that no\nlater chunk reaches the decoder and that the reader ends closed.\n\n* docs(artifacts): record which ESP metadata comparison ignores\n\nSegments are compared by their declaration. The image's and the\nsignature blocks' format_metadata are not: every field comes from their\nown bytes, which content comparison already covers, and a block's\nimage_digest_matches follows the image's content.\n\n* feat(artifacts): inventory and extract ESP flash layouts\n\nA whole-flash dump of an ESP32-family chip was read as its bootloader\nimage, with the partition table, apps and data left as undescribed bytes,\nor refused when it began with erased flash. Read it as an esp-flash-image\ncontainer instead.\n\nThe partition table is decoded as esp_partition_table_verify accepts it\nand is found at the caller's partition_table_offset, at the default\n0x8000, or by scanning 0x1000-aligned sectors for a table whose MD5\nverifies, which the inventory reports as derived. The bootloader is\nlocated at its chip's ROM bootloader offset. Each partition is an entry\nwith its declaration in flat format_metadata; the bootloader and app\npartitions carry ESP image facts from the existing streaming decoder; the\notadata records are reported with a selection derived without rollback or\nanti-rollback, and the running partition stays unknown. One unreadable\npartition does not hide the others, and extraction writes every partition,\nnvs_keys included, as ordinary data.\n\nFlash layouts are detected before single ESP images. The scan runs only\nwhen an ESP image sits at a ROM bootloader offset, and is refused when a\nbootloader at another chip's offset shows that the dump does not start at\nflash address 0. open_binary gains flash_offset and partition_table_offset,\nwhich require format esp-flash-image and are part of the snapshot target\nidentity; the CLI takes them with --target-format esp-flash-image.\nComparison treats a partition's label, type, subtype, range and flags as\nits declaration.\n\n* test(artifacts): verify ESP flash layouts with gen_esp32part, merge-bin and otatool\n\nAdd the optional verify:esp-flash lane. It builds default and relocated\npartition tables with ESP-IDF's gen_esp32part.py, assembles dumps with\nesptool merge-bin, including one written from flash 0x1000, and writes\nOTA records with otatool through flash_file_tool.py, which replaces\nparttool's esptool calls with reads and writes of the dump file.\n\nIt compares REA's bootloader and app facts with esptool image-info, every\npartition with gen_esp32part.py's decoding of the extracted table, and the\nOTA records and derived slot with otatool read_otadata after each switch.\nIt also checks extracted bytes and source integrity, the scan and caller\ntable offsets, flash_offset on the 0x1000 dump, a corrupted app beside\nvalid partitions and a truncated dump. ESP32 linker scripts place the\nconformance bootloader and app in ESP32 address ranges.\n\n* fix(artifacts): read ESP flash layouts as the bootloader does\n\nRead the partition table as bootloader_utility_load_partition_table\ndoes: the last factory, otadata and same-subtype OTA declaration wins,\nand a limitation names repeats. Plan each otadata record within its\npartition and the dump. An otadata partition smaller than two sectors\nselects none, the bootloader's INVALID_INDEX; a record the dump lacks\nleaves the selection unknown while the other record stays reported. The\nfallbacks follow the bootloader's indexes: ota_0-fallback and\nfactory-fallback name no partition when the table declares none, and the\nassumptions add GPIO holds and deep-sleep wake.\n\nRefuse a dump whose bootloader contradicts its origin before the default\ntable offset is tried, whether flash_offset was omitted or given, and keep\nthe ESP image reader's ESP8266 refusal. A table never lies inside the\nlocated bootloader image, so single app images are no longer scanned. An\nexplicit esp-flash-image selection is decided before other container\nsignatures, and the native commands' --target-format no longer takes it.\nSay when no bootloader confirms the default origin.\n\nExempt the primary bootloader and partition_table entries of ESP-IDF 5.3\nfrom placement limits, report every region inside a longer one, and name\npartitions by index when labels repeat ignoring case. Keep an undecodable\nlabel's bytes in label_hex and compare them. Word undescribed ranges as\nstarting at a byte that is not erased, and treat a short erased region as\nerased.\n\nAdd an MCP compare_artifacts test for partition declarations, reader\nidentity and close tests, scan edge cases, the 0x2000 ROM offset and a\nliteral otatool CRC.\n\n* test(artifacts): verify ESP primary layout entries and the otadata fallback\n\nBuild a table with the primary bootloader and partition_table entries\nthat gen_esp32part.py fills from --primary-bootloader-offset, and check\nthat REA reads it with complete coverage, no overlap or misplacement\nlimitation, and a table that agrees with gen_esp32part's decoding. Erase\nthe otadata with otatool after the slot switches and check the records\nagainst read_otadata and the factory fallback.\n\n* refactor(artifacts): share positional entry lifecycle\n\nThe ESP image and ESP flash-layout readers carried the same 138 lines of\nlifecycle code. PositionalArtifactReader now owns it: one preparation\nunder the reader's scope, a carrier recheck before each traversal,\nrefusal of forged entries, range streams that check their length and\nrecheck the carrier when they end, and a close that retires open\nstreams before it releases the carrier.\n\nEach reader keeps its location, decoding, entries and metadata, and\nreturns its entries and coverage from prepareEntries(). Entries carry a\nrequired byte range, which removes the unreachable null-range checks in\nopen(). Failure reasons, messages, order and cancellation do not change.\n\nThe Godot PCK reader keeps its own copy. It reports a member that ends\nearly as a format failure, where the ESP readers report integrity, and\nthe helper cannot express that without an option. The Node SEA reader\nhas the same difference.\n\n* fix(artifacts): report Godot PCK and Node SEA members that end early as integrity\n\nBehavior change: a Godot PCK or Node SEA member stream that delivers\nfewer bytes than its entry declares now fails with reason \"integrity\"\nand the message \"