mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
Open
opened 2026-10-31 01:09:35 +00:00 by bsakaguchi
·
0 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#5808
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/morluto/rea/pull/3529
Author: @josenavarrojimenez-sudo
Created: 10/14/2026
Status: 🔄 Open
Base:
main← Head:feat/visual-reconstruction-claims📝 Commits (3)
17371c0feat(reconstruction): verify visual screenshot claims89a5843feat(adb): retain screen capture pixels for visual claims9b03476feat(adb): record the keyguard state with each screen capture📊 Changes
19 files changed (+1377 additions, -59 deletions)
View changed files
📝
.agents/skills/reverse-engineer-anything/references/evidence-workflows.md(+7 -0)📝
docs/adb-device-analysis.md(+27 -1)📝
scripts/lib/browser-screenshot-e2e.mjs(+1 -1)📝
src/adb/AdbProvider.test.ts(+65 -3)📝
src/adb/AdbProvider.ts(+34 -1)📝
src/adb/AdbShellOutput.test.ts(+13 -1)📝
src/adb/AdbShellOutput.ts(+12 -0)📝
src/browser/CdpBrowserProvider.ts(+1 -1)📝
src/cli/adbCommands.ts(+5 -0)📝
src/contracts/adb/adbToolContracts.ts(+9 -1)📝
src/contracts/sessionToolContracts.ts(+1 -1)📝
src/domain/adb/adbDeviceAnalysis.ts(+36 -9)📝
src/domain/reconstructionUnknowns.ts(+11 -5)📝
src/domain/reconstructionVerification.ts(+61 -7)➕
src/domain/reconstructionVerification.visual.test.ts(+645 -0)📝
src/domain/reconstructionVerificationSchemas.ts(+63 -3)➕
src/domain/reconstructionVisualClaims.ts(+261 -0)📝
src/domain/webScreenshotPixels.test.ts(+40 -3)📝
src/domain/webScreenshotPixels.ts(+85 -22)📄 Description
Summary
Screenshot comparisons can't currently participate in reconstruction verification.
verify_reconstructionaccepts behavioral and structural claims only, so acompare_web_screenshotsrecord has no typed way to support or refute a reconstruction, even though it is the natural evidence for "the rebuilt screen renders like the original".This PR adds a
visualclaim kind. A visual claim cites onecompare_web_screenshotsrecord and its two source captures, and is decided against a threshold, a changed-ratio bound and an optional mask that the specification declares up front.No issue is linked; this is a proposed enhancement within the existing reconstruction-verification contract, opened as a draft for maintainer scope review.
Problem and expected behavior
visualclaim:compare_web_screenshots,rea.web-screenshot-diff,rea-cdp-browserv2, observed, external-service) through the same providers table the other kinds use;capture_web_screenshotorcapture_adb_screen) by artifact SHA-256 and, for ADB, dimensions;include_artifact: true), and requires the recomputed metrics to equal the record;channel_threshold,max_changed_ratioand optionalmask(rectangular regions, a required rationale, and amax_masked_ratio), computing the decision ratio outside the mask;capture_web_screenshot).passfailinclude_artifact: truepass/failunknownunknownunknownmax_masked_ratio, or excludes everythingunknownkeyguard_showing: true)unknownunknownsha256/bytesChange and scope
src/browser/PngVisualDiff.tsbecomessrc/domain/webScreenshotPixels.ts(withgit mv), so the pure domain verifier can recompute comparisons without breaking module boundaries.comparePngScreenshotsis unchanged; the newmeasurePngScreenshots(input, excludedRegions)also counts changed pixels outside the excluded regions.CdpBrowserProviderand the browser screenshot e2e script now import from the new path. No new dependencies.src/domain/reconstructionVisualClaims.tsholds the binding, recomputation and mask logic.reconstructionVerification.tsroutesvisualclaims to it and reuses the shared classification, unknowns and limitations.reconstructionVerificationSchemas.ts):visualClaimSchema(dimensionpixels);visualresult block: threshold, maximum, compared/changed/masked pixels, changed ratio, andrecomputed;summary.visualcount. It is always emitted, but optional when parsing so results recorded before this change still validate. The kind-count invariant treats it as 0 when absent.verify_reconstructiontool description and the skill's evidence-workflows reference.Intentionally not included:
local_path; ADB pixels are recomputed only when the Evidence itself carries them (see below), so bundles stay portable.Opt-in ADB pixel retention (
include_artifact)Second commit.
capture_adb_screenEvidence carried only the PNG digest, size and dimensions, so visual claims citing an ADB capture always stayedunknown.include_artifact: boolean(defaultfalse; CLI--include-artifact). Whentrue, the result also carriesartifact: {sha256, bytes, media_type: "image/png", data_base64}, the same self-verifying shapecapture_web_screenshotreturns, so the artifact can be passed directly tocompare_web_screenshots.capture_adb_screenresult schema rejects an artifact whosesha256/bytesdiffer from the capture, and the artifact schema rejects inline bytes that don't match their own digest.screencapoutput limit. Base64 adds about a third (a 1080×2400 frame is typically 100–400 KB of PNG), which is why the default keeps results digest-only and unchanged. When omitted,artifactis absent, so previously recorded Evidence still parses.reconstructionVisualClaimsuses the ADB artifact when present and recomputes like a web capture. Digest-only ADB sources stayunknown, and their limitation and the default visual probe now point atinclude_artifact.capture_adb_screentool description and example,docs/adb-device-analysis.md, and the skill's evidence-workflows reference.AdbProvidertest for default output (noartifact) and opt-in output whose artifact equals the writtenscreen.pngbyte for byte. All PNGs are synthetic and built in code.scripts/verify-adb.mjsis unchanged.Keyguard state on ADB captures
Third commit, from running visual claims against a real phone over long, unattended capture sessions. The device turned its screen off and locked about 30 seconds later, and
screencapkept returning a valid PNG: the lock screen. Nothing in the Evidence said so, so a visual claim compared the lock screen with the reconstruction and reported an ordinaryfail.keyguard_showing: boolean | nulloncapture_adb_screen. Right after the frame, the provider readsdumpsys window displays(fixed command, same 8 MiB limit asinspect_adb_window) and parsesisKeyguardShowing=.nullmeans the window manager did not declare it; anadbfailure on that read also yieldsnulland never fails the capture, except cancellation, which propagates.keyguard_showing: trueadds a limitation, so the visual claim isunknownwith "unlock the device and recapture", rather than a misleadingfail.falseandnullbehave as before.docs/adb-device-analysis.mdgains "Capture an unattended device". REA never wakes or unlocks the device. Keep-alive is the caller's job, within the caller's authorization; for example, a harmless key event sent only while the expected app is focused. Don't change the screen-timeout or lock settings, and never type a PIN. The section also explains how to render a web reconstruction at the device's exact pixel size:--force-device-scale-factortuned until the dimensions match, safe-area insets for the system bars, and those bars declared as a masked region.parseKeyguardShowing(CRLF,false, undeclared); anAdbProvidertest whose stub declaresisKeyguardShowing=true; the existing capture test now expectskeyguard_showing: nullwhendumpsysfails; visual-claim tests for a locked source (unknown, still recomputed) and an unlocked one (pass).Observed on the real phone (1080×2400), with the application in front:
capture_adb_screenreturnedkeyguard_showing: false, matchingisKeyguardShowing=falsefrom a directdumpsys;include_artifactcapture and a CDP screenshot rendered at the device scale recomputed its decision (recomputed: true). The compared pixels excluded the masked status and gesture bars.Contract and boundary impact
verify_reconstructioninput accepts a new claim kind;summary.visualand an optional per-claimvisualblock;capture_adb_screeninput adds optionalinclude_artifact(defaultfalse) and its output adds an optionalartifact.capture_adb_screenoutput addskeyguard_showing(optional when parsing) and runs one extra read-onlydumpsys window displaysafter the frame.dist/,skills/and the product catalog aren't part of the diff.Expected effects:
Evidence and regression coverage
src/domain/reconstructionVerification.visual.test.ts(12 tests). All fixtures are synthetic 4×4 RGBA PNGs built in code: pass, fail by ratio, fail on dimension mismatch, unknown for a digest-only ADB source, unknown for a different threshold, unknown for a reused capture, unknown for an open unknown, mask (pass with exclusion, oversized mask unknown, out-of-bounds error, blank rationale rejected), and errors for an uncited source, a tampered digest, altered metrics, and a wrong comparison identity;src/domain/webScreenshotPixels.test.ts(the moved diff test) gains a masked-measurement test.main,verify_reconstructionrejects any claim whosekindisvisualat schema validation."visual": {"channel_threshold": 0, "max_changed_ratio": 0.1, "compared_pixels": 16, "changed_pixels": 1, "changed_ratio": 0.0625, "masked_pixels": 0, "recomputed": true}.For evidence-bearing changes:
Validation performed
npx vitest run src/domain/reconstructionVerification.visual.test.ts— 12 passednpx vitest run src/domain/webScreenshotPixels.test.ts src/domain/reconstructionVerification*— 4 files, 110 passednpx vitest run src/domain src/contracts src/browser tests/conformance— 239 files, 3686 passed, 3 skippednpx vitest runon the 10 acceptance/boundary files that reference reconstruction verification, screenshot comparison or session tool contracts (afternpm run build) — 82 passed, 1 failed:localToolContracts.test.ts > accepts NUL as actual terminal input…failed withcleanup_incomplete(process ownership tokenESRCHon a loaded host); rerun alone it passed. It is unrelated to this change.npm run check:fast(typecheck, lint, module boundaries) — passednpm run verify:test-discovery— "Discovered all 1282 test files exactly once."npm run docs:check— 5 passednpm run build— passednpx oxfmt --check .— all files formattedRe-run after the
include_artifactcommit:npm run test:local -- src/domain/reconstructionVerification.visual.test.ts src/adb/AdbProvider.test.ts src/domain/webScreenshotPixels.test.ts— 3 files, 97 passed (visual: 16)npx vitest run src/domain src/contracts src/adb src/cli src/server tests/boundary/mcp/adbMcp.test.ts— 198 files, 3228 passed, 3 skippednpm run build,npm run check:fast,npm run docs:check— passed; Prettier check on the changed files and the pre-commitoxfmt/oxlint— cleannpx vitest run tests/conformance tests/boundary/cli— 2 failures that reproduce identically on the previous commit without this change (cliSetup.test.ts > TTY setup dry run > shows the refusal…,clientProfileLifecycle.test.ts > selected client profiles lifecycle…timing out at 30 s); a third (javascriptApplicationProgress.test.ts, memory constraint under load) passed when rerun alone. Unrelated to this change.npx vitest runexceeded my local 28-minute limit and wasn't completed; CI is the authority for the rest of the suite.Re-run after the keyguard commit:
npx vitest run src/adb src/domain/reconstruction— 12 files, 260 passed (visual: 18,AdbProvider: 63)npm run compile,npx tsc --noEmit,npm run docs:check— passed; Prettier check on the changed files and the pre-commitoxfmt/oxlint— clean;oxlintonsrc/adbreports the same 34 pre-existing warnings as before the commitnode scripts/rea.mjs capture-adb-screen <serial> --output-directory … --format json --full-outputagainst a physical phone —keyguard_showing: falsewith the matching limitationCompatibility, safety, and release
summary.visualis optional when parsing older results;src/browser/PngVisualDiff.tsis nowsrc/domain/webScreenshotPixels.ts. It is an internal module and not a package export.passcovers only the declared screens, threshold and mask; it says nothing about interaction, state or data.Author readiness
Human owner:
Before merge
type(scope): outcome.🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
bsakaguchi referenced this issue2026-11-01 21:11:14 +00:00