trustdex 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.ko.md +65 -5
  2. package/README.md +67 -5
  3. package/bin/trustdex.mjs +182 -3
  4. package/docs/ARCHITECTURE.ko.md +17 -1
  5. package/docs/ARCHITECTURE.md +17 -1
  6. package/docs/CLAUDE.ko.md +33 -1
  7. package/docs/CLAUDE.md +32 -1
  8. package/docs/CODEX.ko.md +34 -4
  9. package/docs/CODEX.md +35 -4
  10. package/docs/DEFENSIVE_USE_CASE.ko.md +12 -0
  11. package/docs/DEFENSIVE_USE_CASE.md +13 -0
  12. package/docs/EVALUATION.ko.md +35 -0
  13. package/docs/EVALUATION.md +35 -0
  14. package/docs/ROADMAP.ko.md +9 -5
  15. package/docs/ROADMAP.md +9 -5
  16. package/docs/THREAT_MODEL.ko.md +8 -0
  17. package/docs/THREAT_MODEL.md +8 -0
  18. package/examples/adversarial/README.ko.md +2 -0
  19. package/examples/adversarial/README.md +2 -0
  20. package/examples/adversarial/bindings/README.ko.md +32 -0
  21. package/examples/adversarial/bindings/README.md +33 -0
  22. package/examples/adversarial/bindings/claude.mcp.json +12 -0
  23. package/examples/adversarial/bindings/claude.settings.json +9 -0
  24. package/examples/adversarial/bindings/codex.toml +9 -0
  25. package/examples/adversarial/bindings/expected.json +27 -0
  26. package/examples/adversarial/bindings/runtime-after.json +21 -0
  27. package/examples/adversarial/bindings/runtime-before.json +13 -0
  28. package/examples/adversarial/bindings/trust-store.json +15 -0
  29. package/package.json +3 -3
  30. package/schemas/effective-runtime-tools-diff-v1.schema.json +50 -0
  31. package/schemas/effective-runtime-tools-v1.schema.json +68 -0
  32. package/schemas/runtime-tool-inventory-v1.schema.json +27 -0
  33. package/schemas/tool-permission-bindings-diff-v1.schema.json +70 -0
  34. package/schemas/tool-permission-bindings-v1.schema.json +94 -0
  35. package/src/bindings.mjs +358 -0
  36. package/src/claude-settings.mjs +49 -0
  37. package/src/runtime-evidence.mjs +318 -0
package/docs/CODEX.ko.md CHANGED
@@ -15,7 +15,7 @@ Codex 클라이언트는 `config.toml`(기본적으로 `~/.codex/` 아래)의 `[
15
15
  ### 1. 현재 설정 검사
16
16
 
17
17
  ```bash
18
- npx trustdex@0.8.0 inspect-codex ~/.codex/config.toml --pack strict
18
+ npx trustdex@0.10.0 inspect-codex ~/.codex/config.toml --pack strict
19
19
  ```
20
20
 
21
21
  이 명령은 파일을 로컬에서 읽으며 네트워크 요청을 하지 않습니다. 출력에는 각 MCP 서버, 소스 유형, 신뢰 신호 및 ALLOW / ASK / BLOCK 결정이 표시됩니다. 환경 변수 이름은 표시될 수 있지만 값은 절대 표시되지 않습니다.
@@ -25,7 +25,7 @@ npx trustdex@0.8.0 inspect-codex ~/.codex/config.toml --pack strict
25
25
  ### 2. 게이트된 사본 작성
26
26
 
27
27
  ```bash
28
- npx trustdex@0.8.0 gate-codex ~/.codex/config.toml \
28
+ npx trustdex@0.10.0 gate-codex ~/.codex/config.toml \
29
29
  --pack official-first \
30
30
  --trust-store ./trust-store.json \
31
31
  --out ./gated-config.toml
@@ -120,13 +120,43 @@ node ./bin/trustdex.mjs diff-permissions \
120
120
  병합 소스 스냅샷은 스키마 v2를 사용합니다. 최종 구조 설정이 같더라도 소스 범위 개수가
121
121
  바뀌면 분류되지 않은 변경으로 처리되어 `NEEDS_REVIEW`를 반환합니다.
122
122
 
123
+ ### MCP 출처와 자동 권한 연결
124
+
125
+ Codex는 한 MCP 서버가 노출한 모든 도구를 자동 승인할 수 있습니다. 이 권한을
126
+ 서버의 정책 및 출처 결과와 함께 검토합니다.
127
+
128
+ ```bash
129
+ node ./bin/trustdex.mjs snapshot-codex-bindings ~/.codex/config.toml \
130
+ --trust-store ./trust-store.json \
131
+ --pack strict \
132
+ --out .trustdex/codex-bindings.json
133
+
134
+ node ./bin/trustdex.mjs diff-bindings \
135
+ .trustdex/approved-codex-bindings.json \
136
+ .trustdex/current-codex-bindings.json
137
+ ```
138
+
139
+ `default_tools_approval_mode = "approve"`는 전체 도구 자동 권한이므로 ALLOW
140
+ 소스에서도 검토가 필요합니다. 와일드카드 도구 범위는 불리언으로 기록하며 도구
141
+ 이름, 엔드포인트 경로 및 관련 없는 값은 제외합니다. 이 정적 연결은 설정이 실제로
142
+ 로드되었음을 증명하거나 Codex 런타임 샌드박스를 강제하지 않습니다.
143
+
144
+ ### 명시적 런타임 인벤토리 비교
145
+
146
+ 권한이 있는 Codex 통합은 해당 세션에 보이는 MCP 서버 이름과 서버별 도구 개수를
147
+ 담은 `agent-runtime-tool-inventory` JSON을 제공할 수 있습니다.
148
+ `snapshot-runtime-tools <bindings> <inventory> --out <evidence>`로 검토된 Codex
149
+ 결합 스냅샷과 대조하고, `diff-runtime-tools`로 노출 확대를 게이트합니다. 이는 옵트인
150
+ 증거 어댑터 계약이며 자동 설정 탐색, 공식 Codex 내보내기 형식 또는 런타임 강제가
151
+ 아닙니다. 캡처 경로와 샌드박스는 클라이언트에서 별도로 확인하세요.
152
+
123
153
  ### 스킬 및 플러그인
124
154
 
125
155
  에이전트 스킬과 플러그인 매니페스트도 같은 방법으로 검사할 수 있습니다.
126
156
 
127
157
  ```bash
128
- npx trustdex@0.8.0 inspect-skill ./path/to/SKILL.md --pack strict
129
- npx trustdex@0.8.0 inspect-plugin ./path/to/plugin.json --pack strict
158
+ npx trustdex@0.10.0 inspect-skill ./path/to/SKILL.md --pack strict
159
+ npx trustdex@0.10.0 inspect-plugin ./path/to/plugin.json --pack strict
130
160
  ```
131
161
 
132
162
  이 명령은 파이프로 연결된 셸 설치 프로그램, 민감한 경로 참조, 네트워크 URL 및 와일드카드 도구 범위와 같은 관찰 가능한 신호를 보고합니다. 스킬이나 플러그인이 안전하다는 것을 증명하지는 않습니다.
package/docs/CODEX.md CHANGED
@@ -15,7 +15,7 @@ Codex clients read MCP server definitions from `[mcp_servers.<name>]` tables in
15
15
  ### 1. Inspect the current configuration
16
16
 
17
17
  ```bash
18
- npx trustdex@0.8.0 inspect-codex ~/.codex/config.toml --pack strict
18
+ npx trustdex@0.10.0 inspect-codex ~/.codex/config.toml --pack strict
19
19
  ```
20
20
 
21
21
  This reads the file locally and makes no network request. The output lists each MCP server, its source type, trust signals, and an ALLOW / ASK / BLOCK decision. Environment variable names may appear; their values never do.
@@ -25,7 +25,7 @@ Use `--json` for machine-readable output and `--trust-store ./trust-store.json`
25
25
  ### 2. Write a gated copy
26
26
 
27
27
  ```bash
28
- npx trustdex@0.8.0 gate-codex ~/.codex/config.toml \
28
+ npx trustdex@0.10.0 gate-codex ~/.codex/config.toml \
29
29
  --pack official-first \
30
30
  --trust-store ./trust-store.json \
31
31
  --out ./gated-config.toml
@@ -136,13 +136,44 @@ for the Codex runtime sandbox.
136
136
  Merged-source snapshots use schema v2. A source-scope count change is unclassified
137
137
  and therefore returns `NEEDS_REVIEW`, even when the final structural settings match.
138
138
 
139
+ ### Bind MCP provenance to automatic grants
140
+
141
+ Codex can automatically approve every tool exposed by one MCP server. Review that
142
+ grant together with the server's policy and provenance result:
143
+
144
+ ```bash
145
+ node ./bin/trustdex.mjs snapshot-codex-bindings ~/.codex/config.toml \
146
+ --trust-store ./trust-store.json \
147
+ --pack strict \
148
+ --out .trustdex/codex-bindings.json
149
+
150
+ node ./bin/trustdex.mjs diff-bindings \
151
+ .trustdex/approved-codex-bindings.json \
152
+ .trustdex/current-codex-bindings.json
153
+ ```
154
+
155
+ `default_tools_approval_mode = "approve"` is an all-tool automatic grant and therefore
156
+ requires review even for an ALLOW source. Wildcard tool scope is recorded as a boolean;
157
+ tool names, endpoint paths, and unrelated values are omitted. This static binding does
158
+ not prove the configuration is loaded or enforce the Codex runtime sandbox.
159
+
160
+ ### Compare an explicit runtime inventory
161
+
162
+ An authorized Codex integration can provide `agent-runtime-tool-inventory` JSON with
163
+ the MCP server names visible to that session and a tool count for each server. Run
164
+ `snapshot-runtime-tools <bindings> <inventory> --out <evidence>` to reconcile it with
165
+ the reviewed Codex binding snapshot, and `diff-runtime-tools` to gate exposure growth.
166
+ This is an opt-in evidence adapter contract, not automatic config discovery, an official
167
+ Codex export format, or runtime enforcement. Confirm the capture path and sandbox in the
168
+ client separately.
169
+
139
170
  ### Skills and plugins
140
171
 
141
172
  Agent skills and plugin manifests can be inspected the same way:
142
173
 
143
174
  ```bash
144
- npx trustdex@0.8.0 inspect-skill ./path/to/SKILL.md --pack strict
145
- npx trustdex@0.8.0 inspect-plugin ./path/to/plugin.json --pack strict
175
+ npx trustdex@0.10.0 inspect-skill ./path/to/SKILL.md --pack strict
176
+ npx trustdex@0.10.0 inspect-plugin ./path/to/plugin.json --pack strict
146
177
  ```
147
178
 
148
179
  These report observable signals such as piped shell installers, references to sensitive paths, network URLs, and wildcard tool scopes. They do not prove a skill or plugin is safe.
@@ -45,6 +45,8 @@ TrustDex는 이 표면에 대한 노출 전 통제를 연구하고 구현합니
45
45
  | 조용한 파서 우회 방지 | 지원하지 않는 보안 관련 구문을 거부하는 전용 어댑터 |
46
46
  | 증거에서 비밀 값 제외 | 출력, 스냅샷 및 설정 지문에서 비밀 값을 제거하는 테스트 |
47
47
  | 승인 상태의 드리프트 표시 | 결정론적 스냅샷, Ed25519 검토 기록 및 재검사 명령 |
48
+ | 소스 신뢰와 자동 권한 조정 | 값이 제거된 Claude/Codex 결합 스냅샷, 스키마, 차이 및 비활성 픽스처 |
49
+ | 검토된 의도와 명시적 런타임 증거 비교 | 값 없는 인벤토리 계약, 실제 경계 대조 및 노출 드리프트 테스트 |
48
50
  | 공급망 모호성 감소 | 명시적 출처 관찰, 아티팩트 다이제스트 검증, 릴리스 체크섬, SBOM 및 빌드 증명 |
49
51
  | 연구 재현성 유지 | 비활성 픽스처, 문서화된 기대 결과, 크로스 플랫폼 CI 및 CodeQL |
50
52
 
@@ -58,6 +60,16 @@ ALLOW 결과는 여전히 관찰된 증거에 대한 정책 결과일 뿐입니
58
60
 
59
61
  `inspect-codex-settings`는 Codex 승인 정책, 검토자 선택, 샌드박스 종류, 네트워크 접근, 추가 쓰기 가능 루트 개수, 웹 검색 모드 및 명시적인 서브에이전트 활성화를 평가합니다. 완전히 파싱하지 않는 사용자 정의 권한, 앱 및 플러그인 표면은 값은 보관하지 않고 보고합니다. `inspect-codex-settings-stack`은 전달된 파일에 시스템부터 CLI까지의 문서화된 우선순위와 순서가 있는 프로젝트 계층을 적용합니다. 활성 계층을 자동으로 찾거나 요구사항을 강제하거나 활성 Codex 샌드박스를 대체하지 않습니다.
60
62
 
63
+ `snapshot-claude-bindings`와 `snapshot-codex-bindings`는 검사된 각 MCP 소스의
64
+ 결정/출처 상태를 자동 도구 권한 형태와 연결합니다. 도구 이름이나 권한 지정자를
65
+ 보관하지 않고 광범위하거나 차단된 권한을 검토할 수 있게 합니다. 이는 정적
66
+ 증거이며 런타임 호출을 강제하지 않습니다.
67
+
68
+ `snapshot-runtime-tools`는 권한이 있는 런타임 어댑터의 값 없는 인벤토리를 받아
69
+ 해당 연결과 대조합니다. 도구 이름을 보관하지 않고 로드된 차단 소스와 예상 밖
70
+ 서버를 드러낼 수 있습니다. 어댑터는 TrustDex 신뢰 경계 밖에 있으므로 신원, 전송
71
+ 및 완전성에는 독립적인 통제가 필요합니다.
72
+
61
73
  ## CVP 신청 경계
62
74
 
63
75
  Anthropic의 현재 Cyber Verification Program 신청은 검증 가능한 개인 또는 조직 정보, 보안 작업 설명 및 요청 티어에 해당하는 통제 준수 확인을 요구합니다. 이 저장소는 보안 작업 설명을 뒷받침할 수 있지만, 저장소 변경만으로 운영자 신원을 증명하거나 계정·기기 통제를 충족할 수는 없습니다.
@@ -45,6 +45,8 @@ This work is defensive engineering. It does not require credential theft, persis
45
45
  | Avoid silent parser bypass | focused adapters reject unsupported security-relevant syntax |
46
46
  | Keep secrets out of evidence | tests for redaction from output, snapshots, and configuration fingerprints |
47
47
  | Make approval drift visible | deterministic snapshots, Ed25519 review records, and recheck commands |
48
+ | Reconcile source trust with automatic grants | value-free Claude/Codex binding snapshots, schemas, diffs, and inert fixtures |
49
+ | Compare reviewed intent with explicit runtime evidence | value-free inventory contract, effective-boundary reconciliation, and exposure drift tests |
48
50
  | Reduce supply-chain ambiguity | explicit provenance observations, artifact digest verification, release checksums, SBOMs, and build attestations |
49
51
  | Keep research reproducible | inert fixtures, documented expectations, cross-platform CI, and CodeQL |
50
52
 
@@ -64,6 +66,17 @@ applies documented system-through-CLI precedence to supplied files, including or
64
66
  project layers. It does not discover the active layers, enforce requirements, or replace
65
67
  the active Codex sandbox.
66
68
 
69
+ `snapshot-claude-bindings` and `snapshot-codex-bindings` connect each inspected MCP
70
+ source decision/provenance state to its automatic tool-grant shape. This makes broad
71
+ or blocked grants reviewable without retaining tool names or permission specifiers.
72
+ It remains static evidence and does not enforce runtime calls.
73
+
74
+ `snapshot-runtime-tools` accepts a value-free inventory from an authorized runtime
75
+ adapter and reconciles it with those bindings. This can surface loaded blocked sources
76
+ and unexpected servers without retaining tool names. The adapter remains outside the
77
+ TrustDex trust boundary, so its identity, transport, and completeness need independent
78
+ controls.
79
+
67
80
  ## CVP application boundary
68
81
 
69
82
  Anthropic's current Cyber Verification Program application asks for verifiable identity or organization details, a description of security work, and an attestation to the controls for the requested tier. This repository can support the security-work description, but repository changes cannot establish the operator's identity or satisfy account and device controls by themselves.
@@ -77,6 +77,41 @@
77
77
  제거된 권한 규칙 안에서 개수는 같고 내용만 바뀌는 경우는 이 구조적 비교의
78
78
  범위 밖입니다.
79
79
 
80
+ ## 도구 출처와 권한 결합 사례
81
+
82
+ `examples/adversarial/bindings/`와 `test/bindings.test.mjs`는 MCP 정책/출처 결과를
83
+ Claude 및 Codex 자동 도구 권한과 연결합니다. 회귀 테스트는 다음을 요구합니다.
84
+
85
+ - ALLOW 소스에 대한 범위 제한 Claude 권한은 `bound`
86
+ - 와일드카드/전체 도구 권한 및 ASK 소스의 권한은 재검토
87
+ - BLOCK 소스 또는 출처 불일치의 권한은 `blocked`
88
+ - 일치하지 않거나 모호한 Claude 규칙은 값을 보관하지 않고 개수만 기록
89
+ - 정책, 출처, 신뢰 저장소 및 권한 확대 드리프트는 재검토
90
+ - 변조된 요약, 상태 또는 다이제스트는 안전하게 실패
91
+ - 엔드포인트 경로, 권한 지정자, 도구 이름 및 비활성 마커 값을 계속 제외
92
+
93
+ 스냅샷 스키마는 안정적인 보고서 형태를 검증합니다. 서명된 신뢰 기록은 검토된
94
+ 스냅샷을 인증할 수 있지만 스키마나 서명 모두 런타임 강제 또는 도구 안전성을
95
+ 증명하지 않습니다.
96
+
97
+ ## 실제 런타임 인벤토리 사례
98
+
99
+ `runtime-before.json`, `runtime-after.json` 및 `test/runtime-evidence.test.mjs`는 옵트인
100
+ 런타임 인벤토리 계약을 검사합니다. 다음을 요구합니다.
101
+
102
+ - 재검토가 필요 없는 관찰된 ALLOW 소스는 일치
103
+ - 관찰된 BLOCK 소스 또는 설정되지 않은 서버는 실제 경계를 차단
104
+ - 관찰된 ASK/광범위 권한 연결은 재검토
105
+ - 설정되었지만 관찰되지 않은 서버는 제한적으로만 변경
106
+ - 새로 관찰된 서버와 도구 개수 증가는 확대
107
+ - 원시 도구 목록, 중복 서버 이름, 예상 밖 필드, 잘못된 타임스탬프 및 변조된 증거는 안전하게 실패
108
+ - 출력에는 서버 이름, 도구 개수, 고정 정책/출처 열거 값 및 다이제스트만 보관
109
+
110
+ 픽스처는 어댑터 형태의 증거이지 실제 Claude 또는 Codex 캡처가 아닙니다. TrustDex는
111
+ 인벤토리의 진위나 완전성을 판단할 수 없습니다. 배포 시 생성자와 전송을 별도로
112
+ 보호해야 합니다. 값 없는 계약이 도구 이름을 의도적으로 제외하므로 도구 개수는
113
+ 같고 집합만 바뀌는 대체는 감지할 수 없습니다.
114
+
80
115
  ## 병합 설정 스택 사례
81
116
 
82
117
  `test/settings-stack.test.mjs`는 두 런타임의 명시적 소스 스택을 검사합니다. 다음을 요구합니다.
@@ -79,6 +79,41 @@ for both runtimes. `test/posture.test.mjs` requires:
79
79
  The digest checks internal consistency, not signer identity. Same-count changes inside
80
80
  redacted permission rules remain outside this structural comparison.
81
81
 
82
+ ## Tool provenance and permission binding cases
83
+
84
+ `examples/adversarial/bindings/` and `test/bindings.test.mjs` join MCP policy/provenance
85
+ results to Claude and Codex automatic tool grants. The regression requires:
86
+
87
+ - a scoped Claude grant to an ALLOW source to be `bound`
88
+ - wildcard or all-tool grants and grants to ASK sources to require review
89
+ - grants to BLOCK sources or provenance mismatches to be `blocked`
90
+ - unmatched and ambiguous Claude rules to be counted without retaining their values
91
+ - policy, provenance, trust-store, and grant expansion drift to require review
92
+ - tampered summaries, statuses, or digests to fail closed
93
+ - endpoint paths, permission specifiers, tool names, and inert marker values to remain absent
94
+
95
+ The snapshot schemas validate the stable report shape. A signed trust record can
96
+ authenticate a reviewed snapshot, but neither the schema nor signature proves runtime
97
+ enforcement or tool safety.
98
+
99
+ ## Effective runtime inventory cases
100
+
101
+ `runtime-before.json`, `runtime-after.json`, and `test/runtime-evidence.test.mjs`
102
+ exercise the opt-in runtime inventory contract. They require:
103
+
104
+ - an observed ALLOW source with no review-required binding to match
105
+ - an observed BLOCK source or unconfigured server to block the effective boundary
106
+ - an observed ASK/broad-grant binding to require review
107
+ - configured but unobserved servers to be restriction-only
108
+ - newly observed servers and tool-count growth to be expansion
109
+ - raw tool lists, duplicate server names, extra fields, invalid timestamps, and tampered evidence to fail closed
110
+ - output to retain only server names, tool counts, fixed policy/provenance enums, and digests
111
+
112
+ The fixture is adapter-shaped evidence, not a live Claude or Codex capture. TrustDex
113
+ cannot determine whether an inventory is authentic or complete; deployments must secure
114
+ the producer and transport separately. Same-count tool-set substitutions are invisible
115
+ because the value-free contract intentionally omits tool names.
116
+
82
117
  ## Merged settings stack cases
83
118
 
84
119
  `test/settings-stack.test.mjs` exercises explicit source stacks for both runtimes. It requires:
@@ -14,6 +14,10 @@ TrustDex는 초기 단계입니다. 이 로드맵은 방향을 공유하며 릴
14
14
  추가합니다.
15
15
  - TrustDex 0.8.0은 문서화된 Claude Code 및 Codex 우선순위를 위한 명시적 병합 소스
16
16
  검사, 스키마 v2 소스 구성 증거 및 안전하게 실패하는 스택 테스트를 추가합니다.
17
+ - TrustDex 0.9.0은 MCP 정책/출처 결과와 자동 도구 권한 사이의 값 없는 Claude/Codex
18
+ 연결, 버전 지정 스키마, 드리프트 검토 및 비활성 픽스처를 추가합니다.
19
+ - TrustDex 0.10.0은 명시적인 값 없는 런타임 인벤토리 계약, 실제 경계 대조,
20
+ 노출 드리프트 검토, 버전 지정 스키마 및 픽스처를 추가합니다.
17
21
 
18
22
  ## 현재: 경계 강화
19
23
 
@@ -24,12 +28,12 @@ TrustDex는 초기 단계입니다. 이 로드맵은 방향을 공유하며 릴
24
28
  - 안정적인 정책 및 스냅샷 스키마 규칙 문서화
25
29
  - CI, CodeQL 및 릴리스 자동화를 재현 가능하고 검토 가능한 상태로 유지
26
30
 
27
- ## 다음: 에이전트 행동 경계를 검토 가능하게 만들기
31
+ ## 다음: 실제 런타임 증거 강화
28
32
 
29
- - 승인된 도구 출처와 해당 도구에 부여된 행동 권한 연결
30
- - 버전이 지정된 권한 상태 JSON 스키마를 추가 결정 및 런타임으로 확장
31
- - 권고형 설정 검사가 런타임 및 운영체제 샌드박스와 결합되는 방식 문서화
32
- - 비공개 파일을 조용히 찾지 않으면서 런타임이 생성한 실제 설정 증거 추가
33
+ - 런타임이 권한 있는 안정적 인터페이스를 제공할 때만 구체적인 옵트인 어댑터 게시
34
+ - 장기 공유 비밀 없이 인벤토리 생성자와 전송 인증
35
+ - 값 없는 보고서를 유지하면서 MCP 표시 범위 밖으로 실제 증거 확장
36
+ - 지원하는 어댑터/런타임 버전의 테스트 기반 호환성 매트릭스 게시
33
37
 
34
38
  ## 그다음: 무결성 증명
35
39
 
package/docs/ROADMAP.md CHANGED
@@ -14,6 +14,10 @@ TrustDex is early-stage. This roadmap communicates direction and is not a releas
14
14
  permission fixtures.
15
15
  - TrustDex 0.8.0 adds explicit merged-source inspection for documented Claude Code
16
16
  and Codex precedence, schema-v2 source topology evidence, and fail-closed stack tests.
17
+ - TrustDex 0.9.0 adds value-free Claude/Codex bindings between MCP policy/provenance
18
+ results and automatic tool grants, versioned schemas, drift review, and inert fixtures.
19
+ - TrustDex 0.10.0 adds an explicit value-free runtime inventory contract, effective
20
+ boundary reconciliation, exposure-drift review, versioned schemas, and fixtures.
17
21
 
18
22
  ## Now: harden the boundary
19
23
 
@@ -24,12 +28,12 @@ TrustDex is early-stage. This roadmap communicates direction and is not a releas
24
28
  - document stable policy and snapshot schema rules
25
29
  - keep CI, CodeQL, and release automation reproducible and reviewable
26
30
 
27
- ## Next: make agent action boundaries reviewable
31
+ ## Next: strengthen effective-runtime evidence
28
32
 
29
- - connect approved tool provenance to the action permissions granted to that tool
30
- - extend the versioned permission-posture JSON schemas to additional decisions and runtimes
31
- - document how advisory settings checks compose with runtime and operating-system sandboxes
32
- - add runtime-produced effective-setting evidence without silently discovering private files
33
+ - ship concrete opt-in adapters only where a runtime exposes an authorized stable interface
34
+ - authenticate inventory producers and transports without introducing long-lived shared secrets
35
+ - extend effective evidence beyond MCP visibility while retaining value-free reports
36
+ - publish a tested compatibility matrix for supported adapter/runtime versions
33
37
 
34
38
  ## Then: prove integrity
35
39
 
@@ -24,6 +24,10 @@ TrustDex는 하나의 좁은 질문을 다룹니다.
24
24
  - 명시적인 검토 없이 변경되는 행동 권한 설정
25
25
  - 값이 제거된 구조적 기준 상태보다 확대되는 Claude 또는 Codex 권한 상태
26
26
  - 명시적으로 전달된 Claude 또는 Codex 설정 소스 사이의 우선순위 변경
27
+ - 서버의 정책/출처 결과와 더 이상 일치하지 않는 자동 MCP 도구 권한
28
+ - 실제 도구 경계를 가리는 와일드카드, 일치하지 않거나 모호한 권한
29
+ - 차단·검토 필요·미설정 MCP 서버를 노출한다고 명시적으로 보고한 런타임 인벤토리
30
+ - 서버 표시 범위 또는 도구 개수로 확대되는 실제 런타임 인벤토리
27
31
 
28
32
  ## 신뢰 경계
29
33
 
@@ -50,6 +54,10 @@ TrustDex는 익숙한 프로젝트 이름, 스타 수, 패키지 이름 또는
50
54
  - 명시적으로 병합한 설정 투영이 런타임에서 활성화된 정책임을 증명하는 것
51
55
  - Claude Code 또는 Codex 행동 권한의 런타임 강제 적용
52
56
  - 서명되지 않은 권한 상태 스냅샷 작성자의 인증
57
+ - 결합 스냅샷이 실행 중인 에이전트가 실제로 불러온 파일을 반영함을 증명하는 것
58
+ - 개별 MCP 도구 호출을 런타임에서 가로채거나 강제하는 것
59
+ - 인벤토리 생성자 인증, 인벤토리 완전성 증명 또는 침해된 어댑터의 거짓 보고 방지
60
+ - 실제 Claude/Codex 세션을 자동으로 찾거나 비공개 상태를 읽는 것
53
61
 
54
62
  ## 중요한 실패 모드
55
63
 
@@ -24,6 +24,10 @@ TrustDex addresses one narrow question:
24
24
  - action-permission settings changing without an explicit review
25
25
  - Claude or Codex permission posture expanding relative to a value-free structural baseline
26
26
  - precedence changes across explicitly supplied Claude or Codex settings sources
27
+ - automatic MCP tool grants that no longer match the server's policy/provenance result
28
+ - wildcard, unmatched, or ambiguous grants that hide the effective tool boundary
29
+ - explicitly reported runtime inventories that expose blocked, review-required, or unconfigured MCP servers
30
+ - effective runtime inventories expanding by server visibility or tool count
27
31
 
28
32
  ## Trust boundaries
29
33
 
@@ -50,6 +54,10 @@ TrustDex does **not** treat a familiar project name, star count, package name, o
50
54
  - proving that the explicitly merged settings projection is the policy active at runtime
51
55
  - enforcing Claude Code or Codex action permissions at runtime
52
56
  - authenticating the author of an unsigned permission posture snapshot
57
+ - proving that a binding snapshot reflects the files actually loaded by a running agent
58
+ - intercepting or enforcing individual MCP tool calls at runtime
59
+ - authenticating an inventory producer, proving inventory completeness, or preventing a compromised adapter from lying
60
+ - discovering live Claude/Codex sessions or reading their private state automatically
53
61
 
54
62
  ## Important failure mode
55
63
 
@@ -10,6 +10,8 @@
10
10
  - `policy.json`은 소스 허용 목록과 독립적으로 차단 신호를 테스트할 수 있도록 픽스처 패키지 1개와 픽스처 호스트 2개를 명시적으로 신뢰합니다.
11
11
  - `expected.json`은 필수 결정과 최소 신호를 기록합니다.
12
12
  - `drift-before.json`과 `drift-after.json`은 검토된 패키지에 비밀 정보를 포함하는 환경 키가 추가되는 상황을 모델링합니다.
13
+ - [`permissions/`](permissions/README.ko.md)는 값이 제거된 Claude/Codex 권한 상태 드리프트를 다룹니다.
14
+ - [`bindings/`](bindings/README.ko.md)는 MCP 출처와 자동 권한 연결 및 명시적 런타임 인벤토리 대조를 다룹니다.
13
15
 
14
16
  모든 패키지 이름은 가상이며, 모든 원격 엔드포인트는 예약된 `.invalid` 최상위 도메인을 사용하고, 자격 증명으로 보이는 모든 값은 자리표시자입니다. 이를 실제 값으로 바꾸지 마세요. TrustDex는 이 파일을 읽지만 나열된 명령을 실행하거나 나열된 엔드포인트에 연결하지 않습니다.
15
17
 
@@ -10,6 +10,8 @@ These files provide a reproducible defensive test of TrustDex's policy boundary.
10
10
  - `policy.json` explicitly trusts one fixture package and two fixture hosts so blocking signals can be tested independently of source allowlisting.
11
11
  - `expected.json` records the required decisions and minimum signals.
12
12
  - `drift-before.json` and `drift-after.json` model a reviewed package gaining a secret-bearing environment key.
13
+ - [`permissions/`](permissions/README.md) covers value-free Claude/Codex permission posture drift.
14
+ - [`bindings/`](bindings/README.md) covers MCP provenance-to-automatic-grant bindings and explicit runtime inventory reconciliation.
13
15
 
14
16
  All package names are fictional, all remote endpoints use the reserved `.invalid` top-level domain, and all apparent credentials are placeholders. Do not replace them with real values. TrustDex reads these files but never executes the listed commands or contacts the listed endpoints.
15
17
 
@@ -0,0 +1,32 @@
1
+ # 도구 출처와 권한 결합 픽스처
2
+
3
+ 이 비활성 픽스처는 MCP 서버의 정책/출처 결과와 해당 서버에 부여된 자동 도구
4
+ 권한을 값 없이 연결하는 TrustDex 동작을 검증합니다. 예약된 `.invalid` 도메인과
5
+ 자리표시자 마커만 사용하며, 검사는 서버에 연결하거나 서버를 실행하지 않습니다.
6
+
7
+ ```bash
8
+ node ../../../bin/trustdex.mjs snapshot-claude-bindings ./claude.mcp.json \
9
+ --settings ./claude.settings.json \
10
+ --trust-store ./trust-store.json \
11
+ --out ./claude.bindings.json
12
+
13
+ node ../../../bin/trustdex.mjs snapshot-codex-bindings ./codex.toml \
14
+ --trust-store ./trust-store.json \
15
+ --out ./codex.bindings.json
16
+
17
+ node ../../../bin/trustdex.mjs snapshot-runtime-tools \
18
+ ./claude.bindings.json ./runtime-after.json \
19
+ --out ./runtime.evidence.json
20
+ ```
21
+
22
+ 검토된 Claude 서버의 범위 제한 승인은 `ALLOW` 결과와 결합됩니다. 출처를 알 수
23
+ 없는 서버의 와일드카드 승인은 `BLOCK` 결과와 결합됩니다. 일치하지 않는 Claude
24
+ 권한 규칙은 개수만 기록하고 값은 보관하지 않습니다. Codex의 검토된 서버도
25
+ `default_tools_approval_mode = "approve"`가 모든 도구를 승인하므로 재검토가 필요합니다.
26
+
27
+ 생성된 보고서는 엔드포인트 경로, 권한 지정자, 도구 이름 및 마커 값을 의도적으로
28
+ 제외합니다. `expected.json`은 안정적인 구조적 결과만 기록합니다.
29
+ 런타임 인벤토리는 명시적으로 제공되는 값 없는 어댑터 출력입니다. 도구 이름 대신
30
+ 서버 이름과 도구 개수만 포함합니다. `runtime-after.json`은 차단된 설정 서버와 예상
31
+ 밖 서버가 노출되는 상황을 모델링합니다. TrustDex는 런타임 상태를 자동으로 찾거나
32
+ 인벤토리 생성자를 인증하지 않습니다.
@@ -0,0 +1,33 @@
1
+ # Tool provenance and permission binding fixtures
2
+
3
+ These inert fixtures exercise TrustDex's value-free link between an MCP server's
4
+ policy/provenance result and the automatic tool permission granted to that server.
5
+ They use reserved `.invalid` domains and placeholder markers; inspection never
6
+ contacts or launches either server.
7
+
8
+ ```bash
9
+ node ../../../bin/trustdex.mjs snapshot-claude-bindings ./claude.mcp.json \
10
+ --settings ./claude.settings.json \
11
+ --trust-store ./trust-store.json \
12
+ --out ./claude.bindings.json
13
+
14
+ node ../../../bin/trustdex.mjs snapshot-codex-bindings ./codex.toml \
15
+ --trust-store ./trust-store.json \
16
+ --out ./codex.bindings.json
17
+
18
+ node ../../../bin/trustdex.mjs snapshot-runtime-tools \
19
+ ./claude.bindings.json ./runtime-after.json \
20
+ --out ./runtime.evidence.json
21
+ ```
22
+
23
+ The reviewed Claude server has a scoped grant bound to an `ALLOW` result. Its
24
+ unknown peer has a wildcard grant bound to a `BLOCK` result. The unmatched Claude
25
+ permission is counted but not retained. Codex's reviewed server still requires
26
+ review because `default_tools_approval_mode = "approve"` grants every tool.
27
+
28
+ Generated reports intentionally omit endpoint paths, permission specifiers, tool
29
+ names, and marker values. `expected.json` records only stable structural outcomes.
30
+ The runtime inventories are explicit, value-free adapter outputs: they contain server
31
+ names and tool counts, not tool names. `runtime-after.json` models a blocked configured
32
+ server and an unexpected server becoming visible. TrustDex does not discover runtime
33
+ state or authenticate the inventory producer.
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "reviewed": {
4
+ "type": "http",
5
+ "url": "https://reviewed-bindings.invalid/mcp/INERT_BINDING_URL_MARKER"
6
+ },
7
+ "unknown": {
8
+ "type": "http",
9
+ "url": "https://unknown-bindings.invalid/mcp/INERT_BINDING_URL_MARKER"
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "mcp__reviewed__read_INERT_BINDING_TOOL_MARKER",
5
+ "mcp__unknown__*",
6
+ "mcp__missing__INERT_BINDING_UNBOUND_MARKER"
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ [mcp_servers.reviewed]
2
+ url = "https://reviewed-bindings.invalid/mcp/INERT_BINDING_URL_MARKER"
3
+ default_tools_approval_mode = "approve"
4
+ enabled_tools = ["read_INERT_BINDING_TOOL_MARKER"]
5
+
6
+ [mcp_servers.unknown]
7
+ url = "https://unknown-bindings.invalid/mcp/INERT_BINDING_URL_MARKER"
8
+ default_tools_approval_mode = "approve"
9
+ enabled_tools = ["*"]
@@ -0,0 +1,27 @@
1
+ {
2
+ "claude": {
3
+ "status": "block",
4
+ "automaticGrantCount": 2,
5
+ "boundCount": 1,
6
+ "blockedCount": 1,
7
+ "unboundAutomaticGrantCount": 1
8
+ },
9
+ "codex": {
10
+ "status": "block",
11
+ "automaticGrantCount": 2,
12
+ "reviewCount": 1,
13
+ "blockedCount": 1
14
+ },
15
+ "runtimeBefore": {
16
+ "status": "restricted",
17
+ "observedServerCount": 1,
18
+ "matchedCount": 1,
19
+ "notObservedCount": 1
20
+ },
21
+ "runtimeAfter": {
22
+ "status": "block",
23
+ "observedServerCount": 3,
24
+ "blockedCount": 1,
25
+ "unexpectedCount": 1
26
+ }
27
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "agent-runtime-tool-inventory",
4
+ "runtime": "claude",
5
+ "capturedAt": "2026-10-24T00:05:00.000Z",
6
+ "captureMethod": "runtime-adapter",
7
+ "servers": [
8
+ {
9
+ "name": "reviewed",
10
+ "toolCount": 2
11
+ },
12
+ {
13
+ "name": "unknown",
14
+ "toolCount": 1
15
+ },
16
+ {
17
+ "name": "unexpected",
18
+ "toolCount": 1
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "agent-runtime-tool-inventory",
4
+ "runtime": "claude",
5
+ "capturedAt": "2026-10-24T00:00:00.000Z",
6
+ "captureMethod": "runtime-adapter",
7
+ "servers": [
8
+ {
9
+ "name": "reviewed",
10
+ "toolCount": 2
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": 1,
3
+ "claims": [
4
+ {
5
+ "type": "remote",
6
+ "subject": "reviewed-bindings.invalid",
7
+ "publisher": "Inert Reviewed Publisher",
8
+ "status": "verified",
9
+ "evidence": {
10
+ "kind": "manual-review",
11
+ "reference": "https://evidence.invalid/trustdex/bindings-review"
12
+ }
13
+ }
14
+ ]
15
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trustdex",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "A local-first trust, provenance, and review gate for AI agent tools, MCP servers, skills, and plugins.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,8 +8,8 @@
8
8
  },
9
9
  "scripts": {
10
10
  "test": "node --test",
11
- "test:research": "node --test test/research-fixtures.test.mjs test/claude-settings.test.mjs test/codex-settings.test.mjs test/posture.test.mjs test/settings-stack.test.mjs",
12
- "check": "node --check bin/trustdex.mjs && node --check src/canonical.mjs && node --check src/claude-config.mjs && node --check src/claude-settings.mjs && node --check src/codex-config.mjs && node --check src/codex-settings.mjs && node --check src/extensions.mjs && node --check src/gate.mjs && node --check src/inspect.mjs && node --check src/policy.mjs && node --check src/policy-packs.mjs && node --check src/posture.mjs && node --check src/provenance.mjs && node --check src/provenance-online.mjs && node --check src/review.mjs && node --check src/snapshot.mjs && node --check src/trust-record.mjs",
11
+ "test:research": "node --test test/research-fixtures.test.mjs test/claude-settings.test.mjs test/codex-settings.test.mjs test/posture.test.mjs test/settings-stack.test.mjs test/bindings.test.mjs test/runtime-evidence.test.mjs",
12
+ "check": "node --check bin/trustdex.mjs && node --check src/bindings.mjs && node --check src/runtime-evidence.mjs && node --check src/canonical.mjs && node --check src/claude-config.mjs && node --check src/claude-settings.mjs && node --check src/codex-config.mjs && node --check src/codex-settings.mjs && node --check src/extensions.mjs && node --check src/gate.mjs && node --check src/inspect.mjs && node --check src/policy.mjs && node --check src/policy-packs.mjs && node --check src/posture.mjs && node --check src/provenance.mjs && node --check src/provenance-online.mjs && node --check src/review.mjs && node --check src/snapshot.mjs && node --check src/trust-record.mjs",
13
13
  "prepublishOnly": "npm test && npm run check"
14
14
  },
15
15
  "engines": {