mirror of
https://github.com/morluto/rea.git
synced 2026-11-03 13:26:10 +00:00
* feat(artifacts): inspect classic iNES container regions
* fix(artifacts): preserve iNES source disappearance as integrity failure
* fix(artifacts): revalidate iNES source before parsing header
* fix(artifacts): validate admitted roots before classification
* fix(artifacts): normalize source loss during root hashing
* fix(artifacts): bind iNES extraction admission to inventory
* test(artifacts): clarify non-executing inspection wording
* fix: preserve binary plist detection with extended magic probe
* test(browser): wait for popup document loads before capture
* fix(artifacts): honor cancellation across source validation
* fix(artifacts): prefer artifact magic over implicit database suffix
* fix(artifacts): select extraction readers from scanned format
* fix(artifacts): complete prefix reads and share ZIP format admission
* fix(browser): budget scenario cleanup for content drain and shutdown
* test(artifacts): admit valid universal inputs before routing
* test(artifacts): verify iNES workflows on macOS
* test(ci): own iNES macOS coverage and portable fixture paths
* fix: preserve cleanup retries and avoid duplicate inventory parsing
* fix(contracts): share ZIP target formats across MCP lifecycle schemas
* fix(target): preserve typed cancellation during descriptor admission
* refactor(artifacts): use JSON-safe inventory producer output directly
* test(artifacts): share file read setup and satisfy CI checks
* fix(artifacts): classify changed admission as integrity failure
* ci: run Mach-O summary delivery coverage on macOS
* test(javascript): align parameter provenance with main contract
* test(browser): await discoverable fixture pages before runtime verification
* fix(artifacts): pass target metadata to format detection
* fix(artifacts): bind extraction to opened target
* fix: repair the static-check failures on the default branch (#2895)
* fix: repair the static-check failures on the default branch
The default branch fails its own required `Static checks` job three ways, so
every pull request reports that job as failed regardless of its own change.
- `npm run format:check` reports `src/domain/functionComparison.test.ts` and
`src/ida/IdaOperationRunner.ts`.
- `npm run lint` reports a duplicate `import { join } from "node:path"` in
`tests/boundary/mcp/ghidraInventoryMcp.test.ts` (lines 4 and 17).
- `npm run typecheck` reports `format: "devin"` missing from the client format
union in `src/application/SupportedClients.ts`, and an unchecked index in
`tests/boundary/cli/clientProfileLifecycle.test.ts`, whose pair array is
inferred as `string[][]`.
Apply the pinned formatter, drop the duplicate import, list the `"devin"` format
that its own definition already uses, and mark the pair array `as const`.
Validation: `npm run check:fast` and `npm run format:check` pass.
* fix(setup): keep Devin on the JSON configuration dialect
---------
Co-authored-by: 吴佳浩 <wujiahao@supremind.com>
Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
(cherry picked from commit df3d96da80)
* fix(artifacts): bind session inventories to target identity
* test(browser): bound fixture readiness acknowledgements
---------
Co-authored-by: 64579525 <17373302683@163.com>
Co-authored-by: 吴佳浩Alben <35291372+XiaoBinGan@users.noreply.github.com>
Co-authored-by: 吴佳浩 <wujiahao@supremind.com>
73 lines
3.9 KiB
Markdown
73 lines
3.9 KiB
Markdown
# Classic iNES container inspection
|
||
|
||
REA recognizes classic iNES from the `NES` + `0x1a` byte signature, independently
|
||
of the file extension. This read-only container inspection uses portable
|
||
Node.js file reads; it needs neither Ghidra nor an emulator.
|
||
|
||
```bash
|
||
rea inspect-artifact ./cartridge.nes --json
|
||
rea extract-artifact ./cartridge.nes --json
|
||
```
|
||
|
||
Through MCP, call `open_binary` with the local path, then `inspect_artifact`.
|
||
Use `extract_artifact` to materialize the regions in the fresh directory named
|
||
by its result. The caller owns that successful extraction directory.
|
||
|
||
## Header and file regions
|
||
|
||
Inspection returns `container-header` and `reconstruction` observations inline.
|
||
The single inventory Evidence under `substeps[].evidence.normalized_result`
|
||
contains the complete graph and an `ines` object:
|
||
|
||
- `ines.header`: original 16-byte `header_hex`, PRG/CHR file-unit counts, mapper,
|
||
raw flags 6/7, trainer and battery flags, and the declared mirroring mode.
|
||
- `occurrences[]`: each region's path, `source_location.offset` and
|
||
`source_location.length` in the original container. Follow `artifact_id` to
|
||
the node's observed SHA-256 and byte count.
|
||
- `ines.reconstruction`: ordered region paths, concatenated byte count,
|
||
SHA-256 and `verified: true`. REA accumulates the concatenation digest during
|
||
the same physical-order region scan that produces node hashes, then compares
|
||
it with the original whole-file digest. Final source freshness is also checked.
|
||
No reconstructed file is written during inspection.
|
||
|
||
Regions are `header.bin`, optional `trainer.bin` (512 bytes),
|
||
`prg/000.bin` onward (16 KiB each), `chr/000.bin` onward (8 KiB each), and
|
||
optional `trailing.bin`. Every input byte is retained, including unused header
|
||
fields and uninterpreted trailing data. Zero CHR-ROM units create no CHR region;
|
||
REA does not fabricate CHR-RAM contents.
|
||
|
||
After extraction, concatenate the materialized files in
|
||
`ines.reconstruction.region_order` from the inspection inventory. Their bytes
|
||
reproduce the input exactly. Graph path order is lexical and is not physical
|
||
file order; use the explicit region order or source offsets.
|
||
|
||
## Supported boundary
|
||
|
||
This increment supports classic iNES with a complete 16-byte header, nonzero
|
||
PRG count, complete declared trainer/PRG/CHR payload, and zero reserved bytes
|
||
12–15. Dirty legacy headers are refused because their upper mapper bits are
|
||
ambiguous; REA does not silently repair them. NES 2.0 and UNIF signatures,
|
||
unsupported header variants and truncated payloads are explicitly refused.
|
||
An arbitrary file named `.nes` is not admitted as iNES.
|
||
|
||
The PRG/CHR units describe file storage, not mapper bank sizes or CPU windows.
|
||
The mapper number and flags are header declarations, not proof of cartridge
|
||
hardware or runtime behavior. Bank switching, 6502/65816 disassembly, emulator
|
||
sessions and interpretation of console-specific trailing data remain outside
|
||
this lane. Raw-binary Ghidra analysis is a separate workflow. This container
|
||
increment addresses the first milestone of [#2072](https://github.com/morluto/rea/issues/2072);
|
||
the related [#1641](https://github.com/morluto/rea/issues/1641) tracks 6502/65816
|
||
native analysis with explicit load addresses and provider limitations. Extracted
|
||
PRG units still need caller-selected CPU windows before static code analysis;
|
||
their physical file offsets do not establish those addresses.
|
||
|
||
Source-owned byte fixtures verify original offsets and hashes, extraction and
|
||
byte-exact reconstruction, CLI/stdio MCP parity, malformed/unsupported inputs,
|
||
failed target-switch recovery, cancellation and source identity. These checks
|
||
do not establish emulator behavior or compatibility with every historical ROM.
|
||
The portable CLI/stdio MCP acceptance and source-identity checks run in Linux
|
||
and macOS CI. The same workflows have also been executed on native Windows x64.
|
||
|
||
Format references: [iNES](https://www.nesdev.org/wiki/INES) and
|
||
[NES 2.0](https://www.nesdev.org/wiki/NES_2.0).
|