mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #4359] [CLOSED] fix(native): report every slice of a signed universal Mach-O signature #6202
Closed
opened 2026-10-31 01:12:39 +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#6202
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/4359
Author: @Ambar-13
Created: 10/16/2026
Status: ❌ Closed
Base:
main← Head:fix/signature-universal-slices📝 Commits (10+)
24e5c08fix(native): report every slice of a signed universal Mach-O signatureb160d44fix(native): inspect slices behind an unsigned default and keep slice entitlement facts7802a07fix(native): name exact slices behind an unsigned default and keep unread entitlements unobservedc836573fix(native): keep signature facts when lipo is unavailable6986254fix(native): report slice signing identity and entitlement values in fulled75ca7fix(native): read entitlement keys as own properties when comparing slices52bea8bfix(native): compare slice entitlements as they arrive and keep exact integerse17beb5Merge origin/main into fix/signature-universal-slices9308314Merge origin/main into fix/signature-universal-slicesadae09efix(native): quote slice identity values and keep cut-off entitlement plists unknown📊 Changes
15 files changed (+1861 additions, -75 deletions)
View changed files
📝
docs/native-investigation.md(+30 -4)📝
src/native/NativeMacOSProvider.ts(+334 -53)➕
src/native/signatureSlices.test.ts(+331 -0)➕
src/native/signatureSlices.ts(+344 -0)📝
tests/boundary/cli/nativeSignatureCli.test.ts(+16 -4)📝
tests/boundary/providers/native/nativeInventory.golden.test.ts(+649 -1)📝
tests/boundary/providers/native/nativeSignatureTargetBinding.test.ts(+29 -13)➕
tests/fixtures/native-macos/codesign-universal-signed/README.md(+47 -0)➕
tests/fixtures/native-macos/codesign-universal-signed/aggregate.txt(+26 -0)➕
tests/fixtures/native-macos/codesign-universal-signed/entitlements-aggregate.xml(+1 -0)➕
tests/fixtures/native-macos/codesign-universal-signed/entitlements-arm64.xml(+1 -0)➕
tests/fixtures/native-macos/codesign-universal-signed/entitlements-x86_64.xml(+1 -0)➕
tests/fixtures/native-macos/codesign-universal-signed/requirements.txt(+1 -0)➕
tests/fixtures/native-macos/codesign-universal-signed/slice-arm64.txt(+26 -0)➕
tests/fixtures/native-macos/codesign-universal-signed/slice-x86_64.txt(+25 -0)📄 Description
Summary
Fixes #4293.
On a universal Mach-O where every slice is signed,
inspect_signaturereturned the identity of one slice and said nothing about the others. Now the fields describe the requested architecture (main's-abinding, since the 2026-10-24 merge below), and the result lists the other slices and their CDHashes, says which slices are signed differently and how, and explains whydesignated_requirementcan list CDHashes thatcdhashesdoesn't. No schema change; the new facts are limitations plus per-sliceprovenanceentries.Problem and expected behavior
Build a two-slice file where the arm64 slice is ad hoc signed as
com.example.armslicewith the hardened runtime anddisable-library-validation, and the x86_64 slice ascom.example.x86slicewith no hardened runtime andget-task-allow(commands intests/fixtures/native-macos/codesign-universal-signed/README.md). On main,rea inspect-signature fixture --jsonreportscom.example.armslice, one CDHash,hardened_runtime: trueand onlydisable-library-validation, with no mention of slices, whiledesignated_requirementlists both CDHashes.Each slice of a universal binary carries its own signature (Apple TN3126), and
codesign -dwithout-adescribes one slice. Presenting one slice's facts as the file's facts gets the x86_64 slice exactly wrong on the two facts that decide whether it can be debugged.Change and scope
src/native/NativeMacOSProvider.ts: when the aggregate display reports a signedMach-O universal (…)with more than one slice, runcodesign -d -a <slice> --verbose=4for each slice (before, this only happened once an aggregate query had already hit an unsigned slice). Parse each signed slice with the existingparseCodeSignature. A slice whose CDHash differs from the aggregate is also asked for its entitlements, since they're sealed per code directory. Unsigned slices keep theUnsigned Mach-O slices: …limitation. Slice names come from codesign's ownFormat=line with no allow-list, soarm64e.x1on macOS 27 is queried too.src/native/signatureSlices.ts(new, pure): finds the described slice by CDHash, lists the others, names the differing fields (identifier, team, authorities, hardened runtime, entitlement keys), and reports CDHashes that appear in the requirement but not incdhashes. An unmatched default slice is reported as unmatched, not guessed. Empty and absent entitlements compare equal, since codesign prints nothing for either.docs/native-investigation.md: a paragraph on what the fields describe for universal files.Not included: a structured per-slice field (agents that want the full record still run
codesign -d -athemselves; the limitation tells them which slices and what differs), and the case where codesign's default slice is the unsigned one, which stayssigned: falseas in #3583.Overlap with #3583: it also queries every slice and renames
#inspectMixedSignatureSlicesto#inspectSignatureSlices, but only to report unsigned slices; its own test asserts no limitation when all slices are signed. This PR adds the comparison on top. If #3583 lands first, I'll rebase.Ordinary fix inside the existing
inspect_signatureboundary. All added commands are read-onlycodesign -druns on the registered snapshot.Review follow-up (second commit)
Codex and Greptile raised four points; all are in the second commit.
signedstays false for the default slice, as #3583 left it. Verified on a real file (arm64 slice unsigned, x86_64 ad hoc signed) on this Mac.<data>or<date>:jsonValueSchemarejected them and the exception took the whole result down.parseEntitlementsnow falls back to the plist projectioninspect_plistuses (typed$plist_typeobjects) with a limitation, and reports an undecodable plist as null instead of throwing. This also hardens the aggregate path, which had the same gap.__proto__keys in a slice's entitlements are now reported asEntitlements of the <slice> slice: …, same as the aggregate.names CDHashes of other slices (x86_64 2696…), and any hash matching no slice is listed separately as unmatched rather than attributed.Tests added: unit tests for the unmatched-hash case and the unsigned-default description; golden tests for an unsigned default slice with a signed sibling (exact provenance) and for a non-default slice whose entitlements hold a data value and a
__proto__key. Re-ran: the signature test set (111 passed), every native test file (49 files),npm run check,npm run docs:check.Review follow-up, round two (third commit)
arm64,arm64eandarm64e.x1. The unsigned path now askslipo -archsfor the names codesign accepts and falls back to the target's families only if lipo cannot answer. The golden test covers a signedarm64e.x1sibling behind an unsignedx86_64default; the real-file run above still works and gains thelipo -archsprovenance entry.parseEntitlementsreports whether it decoded anything; a slice whose plist could not be decoded keeps its entitlements unobserved and is named inEntitlements could not be read for Mach-O slices, so the comparison can no longer sayentitlements nonefor it. The same flag stops slice entitlement queries when the aggregate plist itself did not decode. New golden test with a malformed plist on the non-default slice.__proto__count are replaced by the entitlement-specific ones.9007199254740992and9007199254740993compare as different (golden test); long values are cut at 80 characters but carry their length and a SHA-256 prefix so two long values that differ past the cut still read as different (unit test).constructorortoStringcannot reach a prototype property and throw inside the rendering; unit test added.mach-o-universaltargets, so unsigned thin files never depend on it; the missing-lipo fallback is narrowed to the exactlipo is unavailable through xcrunreason with complete cleanup, so a closed client or cleanup failure still propagates; signed slices behind an unsigned default now report team identifier and authorities too; and entitlement differences carry values (get-task-allow: true (described slice false),… absent) instead of key names only, with a unit test for the same-key-different-value case.Re-ran: signature test set (7 files, 130 passed), every native test file (49 files),
npm run check,npm run docs:check, and the three CLI runs (fixture,/bin/ls, the real default-unsigned file).Merge with main (2026-10-18)
Main rewrote
parseEntitlementsto project entitlement scalars through the plist owners (shared value and exact-number projections). The merge takes that version, which also covers the integer and data cases earlier commits here handled separately, and keeps only thedecodedflag so an undecodable slice plist stays unobserved. After the merge: signature test set 122 passed, every native test file (60 files, 785 passed),npm run checkandnpm run docs:checkok.Review follow-up after CassieFox23's triage (2026-10-19)
One commit (
adae09e) for the five items marked real: a plist with an XML header but no closing tag is now undecodable rather than "no entitlements"; the echoed snapshot path is stripped before the per-slice not-signed verdict is matched, as the main parser already does; identifiers, team, authorities and entitlement keys are JSON-quoted in the limitation sentences; and entitlements are compared on a type-tagged form of the decoded plist as well as the projected JSON, so a<data>value and a dictionary shaped like its wrapper read as different. Each has a test. Left alone with a note on the thread: 21 (retained text size, unmeasured) and 28 (carrying codesign's diagnostic for a failed per-slice query, a design call); 20 is outdated and 22 resolved by the merge with main. Re-ran: signature test set 128 passed, every native test file (62 files, 809 passed),npm run check,npm run docs:check, and the CLI on the two real fixtures.Merge with main (2026-10-22)
Main threaded a per-command deadline through the native provider; the slice and lipo captures now pass it along. Main also added a real-codesign CLI test that runs
inspect-signatureon a universal copy of/usr/bin/truewith forged text in the file name and asserted the limitations list exactly; it now accepts the two slice sentences this PR adds beside the snapshot note, and additionally checks that none of the forged text (authority, identifier, entitlement, requirement) reaches any limitation. On the merged tree: signature test set 143 passed, every native test file (75 files, 987 passed),npm run checkandnpm run docs:checkok.Merges with main (2026-10-21)
Two more merges. Main adopted an exact snapshot-framed unsigned verdict (
isNonzeroUnsignedObservationnow requires codesign's diagnostic for the bound snapshot and nothing else), which supersedes the echoed-path handling fromadae09e; both the aggregate and the per-slice checks use it. Main's #5765 then added partial-observation retention for slice inspection: this merge keeps that, so provenance and limitations accumulate on the shared observation as slices arrive, a slice query that fails for a reason other than being unsigned is a failure that retains the facts collected so far (the earlier "could not be classified" limitation is gone), and the mixed-state notes are recorded before the slice loop. The echoed-file-name test now asserts that failure path. After the merge: signature test set 142 passed, every native test file (71 files, 913 passed),npm run docs:checkok;npm run checkfails only on knip's unlistedg++binary insrc/windows/WindowsHandleClose.test.ts, a file from main (43ac3d1) that this branch does not touch.Merge with main (2026-10-24)
Main's
27216508now asks codesign for the selected architecture with-aon all threeinspect_signaturequeries and probes the other slices only for their signing state, with a limitation saying their metadata is not returned. The merge keeps the-abinding, so the result's fields describe the requested slice by name instead of codesign's host default, and runs this PR's per-slice comparison on top; the limitation now ends "other slices are queried separately" and is followed byOther signed Mach-O slices, the differing fields, and the requirement-hash note. Main's two "unavailable because codesign reported it unsigned" notes replace this branch's mixed-signing notes.One thing surfaced while merging: with
-a, codesign reports the requested slice asFormat=Mach-O thin (<arch>)even for a universal file (checked on/usr/bin/true, macOS 27), so main's probe loop, which takes slice names from the Format line and treats a thin format as no slices, finds nothing on a real universal file; its tests substitute a universal Format line. Here a universal target's slice names come fromlipo -archs(the path this branch already had for the unsigned case), with the target's CPU families as the fallback when lipo is unavailable. Main's real-codesign binding test, which expected the probes to follow the target's CPU families, now expects lipo's exact slice names. On the merged tree: signature test set 91 passed, every native test file (87 files, 1239 passed),npm run checkandnpm run docs:checkok, with Node 26.12.1 as main now requires.Contract and boundary impact
#inspectBoundSignature/#inspectSignatureSlicesin the native macOS provider, plus the newdescribeSignatureSlices.provenancegains one-d -a <slice> --verbose=4entry per slice and one--entitlements :-per differing slice.#captureSignature, so it reads the digest-verified snapshot and re-verifies the target before and after, like the existing calls.Expected effects:
Evidence and regression coverage
Tests added or updated:
src/native/signatureSlices.test.ts(new, 7 tests): differing slices, slices signed alike, unmatched default slice, slices not asked for entitlements, empty vs absent entitlements, case-insensitive CDHash match, no slices.tests/boundary/providers/native/nativeInventory.golden.test.ts: a real-capture case from the issue's fixture asserting the three new limitations and the exact six-command provenance; a signed-alike control (described-slice note only); a thin control (three commands, no slice note, runner throws on any-a). Existing mixed-signature tests pass unchanged.tests/boundary/providers/native/nativeSignatureTargetBinding.test.ts: the real-codesign swap test copies/usr/bin/true, which is universal, so it now checks that every call, including per-slice ones, reads$ARTIFACTinstead of expecting exactly three.Base reproduction: built main
42fc6c5and ran the CLI on the fixture; output as described above, three provenance entries, no slice limitation. The new golden test fails on main.CLI output on this branch (macOS 27.0.1 arm64):
Remaining proof gaps: one Apple Silicon Mac. On Intel the default slice differs, so the fields describe a different slice (the limitation names it). Slice names beyond
x86_64,arm64,arm64e,arm64e.x1weren't tried against real codesign. Extra run time not measured: onecodesign -d -aper slice and one--entitlementsper differing slice, only for signed universal files.For evidence-bearing changes:
Validation performed
macOS 27.0.1 arm64, Node 26.7.0, npm 11.19.0, on top of main
42fc6c5.npm ci --ignore-scripts— oknpm run test:focusedon the 7 signature-related files (new unit test, golden, target binding, nativeProvider, nativeSignatureCli, nativeSignatureTargetBindingMcp, appleApplication) — 127 passednpm run test:focusedon every test file undertests/boundary/providers/nativeandsrc/native(49 files) — 625 passednpm run check:fast— oknpm run check— oknpm run docs:check— oknpm run verify:test-discovery— all 1401 test files found oncenpm run build:cached, then the CLI runs above before and aftertest:fast), Linux, Intel macOSCompatibility, safety, and release
codesignon macOS 27.0.1 arm64 (CLI runs and the/usr/bin/truetest).codesign -don the registered snapshot; no target execution.Author readiness
Human owner: @Ambar-13
Before merge
🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.