trustdex 0.10.0 → 0.11.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.
package/README.ko.md CHANGED
@@ -72,6 +72,7 @@ TrustDex는 이름, 스타 수 또는 브랜딩만으로 "공식" 여부를 추
72
72
  - 무결성 기반 신뢰 증거를 설정된 패키지 버전에 연결하고 불일치 차단
73
73
  - 각 Claude/Codex MCP 소스의 결정·출처 상태를 도구 이름이나 규칙 값 없이 자동 도구 권한과 연결
74
74
  - 명시적으로 제공된 값 없는 런타임 MCP 인벤토리를 검토된 연결과 대조해 차단되거나 예상 밖으로 로드된 서버 감지
75
+ - 수명이 짧은 런타임 인벤토리를 Ed25519 생성자 증명, 만료 및 선택적 캡처 나이 제한으로 인증
75
76
 
76
77
  ## 호환성
77
78
 
@@ -84,8 +85,8 @@ Node.js 20 이상이 필요합니다.
84
85
  npm에서 직접 실행:
85
86
 
86
87
  ```bash
87
- npx trustdex@0.10.0 --help
88
- npx trustdex@0.10.0 inspect ./mcp.json --pack strict --policy ./trustdex.policy.json
88
+ npx trustdex@0.11.0 --help
89
+ npx trustdex@0.11.0 inspect ./mcp.json --pack strict --policy ./trustdex.policy.json
89
90
  ```
90
91
 
91
92
  또는 소스 체크아웃에서 작업:
@@ -205,7 +206,7 @@ node ./bin/trustdex.mjs gate-claude ./.mcp.json --pack strict --out .trustdex/cl
205
206
  claude --strict-mcp-config --mcp-config .trustdex/claude-mcp.json
206
207
  ```
207
208
 
208
- Claude를 시작하기 전에 게이트의 결과를 확인하세요. 기본적으로 `ALLOW` 항목만 노출되며, `ASK` 항목에는 검토가 필요합니다. 어댑터는 검사할 수 없는 설정을 조용히 신뢰하지 않고 거부합니다. 이 명령은 npm 0.5.0 이상과 소스 체크아웃에서 사용할 수 있습니다. 게시된 CLI를 실행하려면 `node ./bin/trustdex.mjs` 대신 `npx trustdex@0.10.0`을 사용하세요.
209
+ Claude를 시작하기 전에 게이트의 결과를 확인하세요. 기본적으로 `ALLOW` 항목만 노출되며, `ASK` 항목에는 검토가 필요합니다. 어댑터는 검사할 수 없는 설정을 조용히 신뢰하지 않고 거부합니다. 이 명령은 npm 0.5.0 이상과 소스 체크아웃에서 사용할 수 있습니다. 게시된 CLI를 실행하려면 `node ./bin/trustdex.mjs` 대신 `npx trustdex@0.11.0`을 사용하세요.
209
210
 
210
211
  지원되는 설정, PowerShell 오류 처리, 서명된 검토 및 Claude Desktop 워크플로는 [Claude에서 TrustDex 사용하기](docs/CLAUDE.ko.md)를 참고하세요.
211
212
 
@@ -314,9 +315,23 @@ Claude에서는 `--settings` 대신 스택 소스 플래그를 사용할 수 있
314
315
  가로채지 않고 이 명시적 입력을 결합 스냅샷과 대조합니다.
315
316
 
316
317
  ```bash
318
+ node ./bin/trustdex.mjs keygen \
319
+ --private .trustdex/runtime-producer-private.pem \
320
+ --public .trustdex/runtime-producer-public.pem
321
+
322
+ node ./bin/trustdex.mjs sign-runtime-inventory \
323
+ ./runtime-tool-inventory.json \
324
+ --private .trustdex/runtime-producer-private.pem \
325
+ --out .trustdex/runtime-attestation.json \
326
+ --ttl-seconds 300
327
+
317
328
  node ./bin/trustdex.mjs snapshot-runtime-tools \
318
329
  .trustdex/claude-bindings.json \
319
330
  ./runtime-tool-inventory.json \
331
+ --attestation .trustdex/runtime-attestation.json \
332
+ --public .trustdex/runtime-producer-public.pem \
333
+ --max-age-seconds 120 \
334
+ --require-authenticated \
320
335
  --out .trustdex/runtime-tools.json
321
336
 
322
337
  node ./bin/trustdex.mjs diff-runtime-tools \
@@ -327,13 +342,17 @@ node ./bin/trustdex.mjs diff-runtime-tools \
327
342
 
328
343
  관찰된 BLOCK 소스와 예상 밖 서버는 `block`, 관찰된 ASK 또는 광범위한 자동 권한
329
344
  연결은 `needs-review`가 됩니다. 인벤토리에 없는 설정 서버는 제한적으로만 변한
330
- 상태입니다. 도구 개수 증가와 새로 관찰된 서버는 재검토를 요구합니다. 입력과 출력은
345
+ 상태입니다. 도구 개수 증가와 새로 관찰된 서버는 재검토를 요구합니다. 인증하지 않은
346
+ 스키마 v2 인벤토리는 항상 최소 `needs-review`가 됩니다. 인증은 정확한 인벤토리,
347
+ 고정된 생성자 키, 만료 및 선택적 캡처 나이 제한을 검증하지만 완전성이나 어댑터
348
+ 안전성을 증명하지는 않습니다. 스키마는
331
349
  [`schemas/runtime-tool-inventory-v1.schema.json`](schemas/runtime-tool-inventory-v1.schema.json),
332
- [`schemas/effective-runtime-tools-v1.schema.json`](schemas/effective-runtime-tools-v1.schema.json),
333
- [`schemas/effective-runtime-tools-diff-v1.schema.json`](schemas/effective-runtime-tools-diff-v1.schema.json)으로
334
- 검증할 수 있습니다. TrustDex는 전달된 증거의 형태와 다이제스트를 검증하지만 어댑터를
335
- 인증하거나 인벤토리의 완전성을 증명하거나 런타임을 강제하지 않습니다. 도구 이름
336
- 대신 개수만 보관하므로 개수는 같고 도구 집합만 바뀌는 대체는 비교 범위 밖입니다.
350
+ [`schemas/runtime-tool-inventory-attestation-v1.schema.json`](schemas/runtime-tool-inventory-attestation-v1.schema.json),
351
+ [`schemas/effective-runtime-tools-v2.schema.json`](schemas/effective-runtime-tools-v2.schema.json),
352
+ [`schemas/effective-runtime-tools-diff-v2.schema.json`](schemas/effective-runtime-tools-diff-v2.schema.json)입니다.
353
+ 기존 v1 실제 보고서도 계속 읽을 수 있습니다. 도구 이름 대신 개수만 보관하므로 개수는
354
+ 같고 도구 집합만 바뀌는 대체는 비교 범위 밖입니다. 검증, 키 교체 및 위협 경계는
355
+ [인증된 런타임 증거](docs/RUNTIME_EVIDENCE.ko.md)를 참고하세요.
337
356
 
338
357
  ## 온라인 출처 관찰
339
358
 
@@ -480,7 +499,7 @@ node ./bin/trustdex.mjs verify .trustdex/trust-record.json \
480
499
  ```yaml
481
500
  - uses: actions/checkout@v4
482
501
 
483
- - uses: grigent/trustdex@v0.10.0
502
+ - uses: grigent/trustdex@v0.11.0
484
503
  with:
485
504
  config: ./mcp.json
486
505
  pack: official-first
@@ -502,7 +521,7 @@ node ./bin/trustdex.mjs verify .trustdex/trust-record.json \
502
521
 
503
522
  ## 로드맵
504
523
 
505
- 공개 로드맵은 [docs/ROADMAP.ko.md](docs/ROADMAP.ko.md)에서 관리합니다. 단기 작업은 인증된 런타임 증거 생성자, 안정적인 옵트인 어댑터, 재현 가능한 통제 및 실제 파일럿 피드백에 중점을 둡니다. 로드맵 항목은 계획이며 약속이 아닙니다.
524
+ 공개 로드맵은 [docs/ROADMAP.ko.md](docs/ROADMAP.ko.md)에서 관리합니다. 단기 작업은 안정적인 옵트인 런타임 어댑터, 호환성 테스트, 재현 가능한 통제 및 실제 파일럿 피드백에 중점을 둡니다. 로드맵 항목은 계획이며 약속이 아닙니다.
506
525
 
507
526
  ## 보안
508
527
 
package/README.md CHANGED
@@ -72,6 +72,7 @@ TrustDex deliberately does not infer "official" status from names, stars, or bra
72
72
  - bind integrity-backed trust evidence to the configured package version and block mismatches
73
73
  - bind each Claude/Codex MCP source decision and provenance state to its automatic tool grant without retaining tool names or rule values
74
74
  - reconcile explicit, value-free runtime MCP inventories with reviewed bindings and detect blocked or unexpected loaded servers
75
+ - authenticate short-lived runtime inventories with Ed25519 producer attestations, expiry, and optional capture-age limits
75
76
 
76
77
  ## Compatibility
77
78
 
@@ -84,8 +85,8 @@ Requires Node.js 20+.
84
85
  Run directly from npm:
85
86
 
86
87
  ```bash
87
- npx trustdex@0.10.0 --help
88
- npx trustdex@0.10.0 inspect ./mcp.json --pack strict --policy ./trustdex.policy.json
88
+ npx trustdex@0.11.0 --help
89
+ npx trustdex@0.11.0 inspect ./mcp.json --pack strict --policy ./trustdex.policy.json
89
90
  ```
90
91
 
91
92
  Or work from a source checkout:
@@ -214,7 +215,7 @@ claude --strict-mcp-config --mcp-config .trustdex/claude-mcp.json
214
215
  Check the gate's result before starting Claude. Only `ALLOW` entries are exposed by
215
216
  default; `ASK` entries require review. The adapter rejects settings it cannot
216
217
  inspect instead of silently trusting them. These commands are available in npm 0.5.0 and later, and from a source checkout.
217
- Use `npx trustdex@0.10.0` in place of `node ./bin/trustdex.mjs` to run the published CLI.
218
+ Use `npx trustdex@0.11.0` in place of `node ./bin/trustdex.mjs` to run the published CLI.
218
219
 
219
220
  See [Using TrustDex with Claude](docs/CLAUDE.md) for supported settings, PowerShell
220
221
  error handling, signed review, and the Claude Desktop workflow.
@@ -330,9 +331,23 @@ capture method, server names, and tool counts. TrustDex reconciles that explicit
330
331
  with a binding snapshot without searching private files or intercepting tool calls:
331
332
 
332
333
  ```bash
334
+ node ./bin/trustdex.mjs keygen \
335
+ --private .trustdex/runtime-producer-private.pem \
336
+ --public .trustdex/runtime-producer-public.pem
337
+
338
+ node ./bin/trustdex.mjs sign-runtime-inventory \
339
+ ./runtime-tool-inventory.json \
340
+ --private .trustdex/runtime-producer-private.pem \
341
+ --out .trustdex/runtime-attestation.json \
342
+ --ttl-seconds 300
343
+
333
344
  node ./bin/trustdex.mjs snapshot-runtime-tools \
334
345
  .trustdex/claude-bindings.json \
335
346
  ./runtime-tool-inventory.json \
347
+ --attestation .trustdex/runtime-attestation.json \
348
+ --public .trustdex/runtime-producer-public.pem \
349
+ --max-age-seconds 120 \
350
+ --require-authenticated \
336
351
  --out .trustdex/runtime-tools.json
337
352
 
338
353
  node ./bin/trustdex.mjs diff-runtime-tools \
@@ -344,14 +359,17 @@ node ./bin/trustdex.mjs diff-runtime-tools \
344
359
  Observed BLOCK sources and unexpected servers produce `block`; observed ASK or broad
345
360
  automatic-grant bindings produce `needs-review`; configured servers absent from the
346
361
  inventory are restriction-only. Tool-count growth and newly observed servers require
347
- review. The input and output schemas are
362
+ review. An unauthenticated schema-v2 inventory is always at least `needs-review`.
363
+ Authentication verifies the exact inventory, pinned producer key, expiry, and optional
364
+ capture-age limit; it does not prove completeness or adapter safety. The schemas are
348
365
  [`schemas/runtime-tool-inventory-v1.schema.json`](schemas/runtime-tool-inventory-v1.schema.json),
349
- [`schemas/effective-runtime-tools-v1.schema.json`](schemas/effective-runtime-tools-v1.schema.json),
350
- and [`schemas/effective-runtime-tools-diff-v1.schema.json`](schemas/effective-runtime-tools-diff-v1.schema.json).
351
- TrustDex validates the supplied evidence shape and digest but does not authenticate the
352
- adapter, prove that the inventory is complete, or enforce the runtime. Because the
353
- contract retains counts instead of tool names, same-count tool-set substitutions remain
354
- outside this comparison.
366
+ [`schemas/runtime-tool-inventory-attestation-v1.schema.json`](schemas/runtime-tool-inventory-attestation-v1.schema.json),
367
+ [`schemas/effective-runtime-tools-v2.schema.json`](schemas/effective-runtime-tools-v2.schema.json),
368
+ and [`schemas/effective-runtime-tools-diff-v2.schema.json`](schemas/effective-runtime-tools-diff-v2.schema.json).
369
+ Legacy v1 effective reports remain readable. Because the contract retains counts instead
370
+ of tool names, same-count tool-set substitutions remain outside this comparison. See
371
+ [Authenticated runtime evidence](docs/RUNTIME_EVIDENCE.md) for verification, key rotation,
372
+ and threat-boundary guidance.
355
373
 
356
374
  ## Online provenance observations
357
375
 
@@ -498,7 +516,7 @@ The private key should never be committed.
498
516
  ```yaml
499
517
  - uses: actions/checkout@v4
500
518
 
501
- - uses: grigent/trustdex@v0.10.0
519
+ - uses: grigent/trustdex@v0.11.0
502
520
  with:
503
521
  config: ./mcp.json
504
522
  pack: official-first
@@ -520,7 +538,7 @@ For production CI, pin the action to a reviewed commit SHA rather than a moving
520
538
 
521
539
  ## Roadmap
522
540
 
523
- The public roadmap is maintained in [docs/ROADMAP.md](docs/ROADMAP.md). Near-term work focuses on authenticated runtime-evidence producers, stable opt-in adapters, reproducible controls, and real-world pilot feedback. Roadmap items are intentions, not promises.
541
+ The public roadmap is maintained in [docs/ROADMAP.md](docs/ROADMAP.md). Near-term work focuses on stable opt-in runtime adapters, compatibility tests, reproducible controls, and real-world pilot feedback. Roadmap items are intentions, not promises.
524
542
 
525
543
  ## Security
526
544
 
package/bin/trustdex.mjs CHANGED
@@ -40,6 +40,10 @@ import {
40
40
  createEffectiveRuntimeEvidence,
41
41
  diffEffectiveRuntimeEvidence
42
42
  } from '../src/runtime-evidence.mjs';
43
+ import {
44
+ createRuntimeInventoryAttestation,
45
+ verifyRuntimeInventoryAttestation
46
+ } from '../src/runtime-attestation.mjs';
43
47
  import { gateMcpConfig } from '../src/gate.mjs';
44
48
  import { assessReview } from '../src/review.mjs';
45
49
  import {
@@ -113,7 +117,13 @@ Usage:
113
117
  [--trust-store trust-store.json] [--pack ...]
114
118
  trustdex diff-bindings <before.json> <after.json> [--json]
115
119
  trustdex snapshot-runtime-tools <bindings.json> <inventory.json> --out runtime.json
120
+ [--attestation attestation.json --public key.pem] [--max-age-seconds n]
121
+ [--require-authenticated]
116
122
  trustdex diff-runtime-tools <before.json> <after.json> [--json]
123
+ trustdex sign-runtime-inventory <inventory.json> --private key.pem --out attestation.json
124
+ [--ttl-seconds 300]
125
+ trustdex verify-runtime-inventory <inventory.json> --attestation attestation.json
126
+ --public key.pem [--max-age-seconds n] [--json]
117
127
  trustdex policy <strict|official-first|development>
118
128
 
119
129
  trustdex keygen --private trustdex-private.pem --public trustdex-public.pem
@@ -165,6 +175,15 @@ function hasFlag(args, name) {
165
175
  return args.includes(name);
166
176
  }
167
177
 
178
+ function getIntegerFlag(args, name, fallback = undefined) {
179
+ const value = getFlag(args, name);
180
+ if (value === null) return fallback;
181
+ if (!/^\d+$/.test(value)) throw new Error(`${name} requires a non-negative integer.`);
182
+ const parsed = Number(value);
183
+ if (!Number.isSafeInteger(parsed)) throw new Error(`${name} exceeds the supported integer range.`);
184
+ return parsed;
185
+ }
186
+
168
187
  function label(action) {
169
188
  if (action === 'allow') return 'ALLOW';
170
189
  if (action === 'ask') return 'ASK';
@@ -560,15 +579,77 @@ async function main() {
560
579
  if (!bindingsPath || !inventoryPath || !out) {
561
580
  throw new Error('snapshot-runtime-tools requires <bindings.json> <inventory.json> and --out <runtime.json>.');
562
581
  }
582
+ const inventory = await readJson(inventoryPath);
583
+ const attestationPath = getFlag(args, '--attestation');
584
+ const publicPath = getFlag(args, '--public');
585
+ if (Boolean(attestationPath) !== Boolean(publicPath)) {
586
+ throw new Error('Runtime inventory authentication requires both --attestation and --public.');
587
+ }
588
+ if (!attestationPath && getFlag(args, '--max-age-seconds') !== null) {
589
+ throw new Error('--max-age-seconds requires --attestation and --public.');
590
+ }
591
+ let authentication = null;
592
+ if (attestationPath && publicPath) {
593
+ const verification = verifyRuntimeInventoryAttestation(
594
+ inventory,
595
+ await readJson(attestationPath),
596
+ await fs.readFile(publicPath, 'utf8'),
597
+ { maxAgeSeconds: getIntegerFlag(args, '--max-age-seconds') }
598
+ );
599
+ if (!verification.valid) {
600
+ throw new Error(`Runtime inventory attestation verification failed: ${verification.reason}`);
601
+ }
602
+ authentication = verification;
603
+ } else if (hasFlag(args, '--require-authenticated')) {
604
+ throw new Error('Authenticated runtime inventory evidence is required.');
605
+ }
563
606
  const snapshot = createEffectiveRuntimeEvidence(
564
607
  await readJson(bindingsPath),
565
- await readJson(inventoryPath)
608
+ inventory,
609
+ authentication
566
610
  );
567
611
  await writeFileSafe(out, `${JSON.stringify(snapshot, null, 2)}\n`);
568
612
  console.log(`Wrote ${out}\nStatus: ${snapshot.status}\nDigest: ${snapshot.digest}`);
569
613
  return;
570
614
  }
571
615
 
616
+ if (command === 'sign-runtime-inventory') {
617
+ const inventoryPath = args[1];
618
+ const privatePath = getFlag(args, '--private');
619
+ const out = getFlag(args, '--out');
620
+ if (!inventoryPath || !privatePath || !out) {
621
+ throw new Error('sign-runtime-inventory requires <inventory.json>, --private <key.pem>, and --out <attestation.json>.');
622
+ }
623
+ const attestation = createRuntimeInventoryAttestation(
624
+ await readJson(inventoryPath),
625
+ await fs.readFile(privatePath, 'utf8'),
626
+ { ttlSeconds: getIntegerFlag(args, '--ttl-seconds', 300) }
627
+ );
628
+ await writeFileSafe(out, `${JSON.stringify(attestation, null, 2)}\n`);
629
+ console.log(`Wrote ${out}\nProducer key: ${attestation.producerKeyId}\nExpires: ${attestation.expiresAt}`);
630
+ return;
631
+ }
632
+
633
+ if (command === 'verify-runtime-inventory') {
634
+ const inventoryPath = args[1];
635
+ const attestationPath = getFlag(args, '--attestation');
636
+ const publicPath = getFlag(args, '--public');
637
+ if (!inventoryPath || !attestationPath || !publicPath) {
638
+ throw new Error('verify-runtime-inventory requires <inventory.json>, --attestation <file>, and --public <key.pem>.');
639
+ }
640
+ const verification = verifyRuntimeInventoryAttestation(
641
+ await readJson(inventoryPath),
642
+ await readJson(attestationPath),
643
+ await fs.readFile(publicPath, 'utf8'),
644
+ { maxAgeSeconds: getIntegerFlag(args, '--max-age-seconds') }
645
+ );
646
+ if (hasFlag(args, '--json')) console.log(JSON.stringify(verification, null, 2));
647
+ else if (verification.valid) console.log(`VERIFIED ${verification.producerKeyId}`);
648
+ else console.log(`INVALID: ${verification.reason}`);
649
+ if (!verification.valid) process.exitCode = 2;
650
+ return;
651
+ }
652
+
572
653
  if (command === 'diff-permissions') {
573
654
  const beforePath = args[1];
574
655
  const afterPath = args[2];
@@ -14,7 +14,7 @@ TrustDex는 관찰, 정책, 게이트 및 검토 증거를 분리하는 의존
14
14
  4. 정책 엔진이 ALLOW, ASK 또는 BLOCK을 생성합니다.
15
15
  5. 게이트가 승인된 설정만 출력합니다.
16
16
  6. MCP 스냅샷, 권한 상태 스냅샷, 출처–권한 결합 스냅샷 및 서명된 신뢰 기록을 통해 이후 드리프트를 검토할 수 있습니다.
17
- 7. 명시적으로 전달된 값 없는 런타임 인벤토리를 검토된 연결과 대조할 수 있습니다. TrustDex는 런타임을 자동으로 찾거나 가로채지 않습니다.
17
+ 7. 명시적으로 전달된 값 없는 런타임 인벤토리를 수명이 짧은 Ed25519 생성자 증명으로 인증하고 검토된 연결과 대조할 수 있습니다. TrustDex는 런타임을 자동으로 찾거나 가로채지 않습니다.
18
18
 
19
19
  게이트가 강제 적용 경계입니다. 보고서만으로는 에이전트가 검토되지 않은 확장을 불러오는 것을 막을 수 없습니다.
20
20
 
@@ -35,6 +35,7 @@ TrustDex는 관찰, 정책, 게이트 및 검토 증거를 분리하는 의존
35
35
  | `src/posture.mjs` | 값이 제거된 Claude/Codex 권한 상태 스냅샷 및 자율성 확대 분류 |
36
36
  | `src/bindings.mjs` | 값이 제거된 MCP 소스/출처와 자동 도구 권한의 연결 및 드리프트 분류 |
37
37
  | `src/runtime-evidence.mjs` | 명시적 런타임 인벤토리 검증, 실제 경계 대조 및 노출 드리프트 |
38
+ | `src/runtime-attestation.mjs` | Ed25519 런타임 인벤토리 생성자 서명, 신선도, 키 ID 및 정확한 인벤토리 검증 |
38
39
  | `src/trust-record.mjs` | Ed25519 검토 기록 서명 및 검증 |
39
40
  | `src/review.mjs` | 서명된 기준선 비교 |
40
41
 
@@ -46,6 +47,7 @@ TrustDex는 관찰, 정책, 게이트 및 검토 증거를 분리하는 의존
46
47
  - 권한 상태 스냅샷은 소스 경로와 설정 값을 제외해야 하며, 새 자율성 또는 정책 의미 변경은 검토를 요구해야 합니다.
47
48
  - 결합 스냅샷은 권한 지정자와 도구 이름을 제외해야 하며, ASK/BLOCK 소스의 자동 권한, 와일드카드 확대, 출처 변경 또는 모호하거나 연결되지 않은 규칙을 안전한 연결로 표시해서는 안 됩니다.
48
49
  - 런타임 증거는 원시 도구 목록과 예상 밖 필드를 거부하고, 관찰된 BLOCK/미설정 서버를 차단하며, 새로 관찰된 서버나 도구 개수 증가를 검토가 필요한 확대로 처리해야 합니다.
50
+ - 인증하지 않은 런타임 증거는 절대 `matched`나 `restricted`가 되어서는 안 됩니다. 검증 상태에는 전달된 고정 키의 정확한 인벤토리 서명, 유효한 만료 및 설정된 신선도 제한이 필요합니다.
49
51
  - 알 수 없는 증거가 신뢰로 바뀌어서는 안 됩니다.
50
52
  - 차단 신호의 심각도를 출처 정보로 낮춰서는 안 됩니다.
51
53
  - 지원하지 않는 보안 관련 구문은 안전하게 실패해야 합니다.
@@ -62,8 +64,10 @@ ALLOW 소스를 가리킨다는 뜻이며, 도구 구현이 안전하거나 런
62
64
 
63
65
  런타임 증거는 권한이 있는 어댑터가 제공하는 세 번째 옵트인 투영을 추가합니다.
64
66
  계약에는 도구 이름, 엔드포인트, 경로 또는 자격 증명이 아니라 서버 이름과 도구
65
- 개수만 포함됩니다. 인벤토리 다이제스트는 내부 상태만 검증합니다. 운영자는 별도의
66
- 신뢰할 수 있는 채널로 생성자를 인증하고 완전성을 확인해야 합니다.
67
+ 개수만 포함됩니다. 수명이 짧은 Ed25519 증명은 정확한 인벤토리를 고정된 생성자 키에
68
+ 연결할 수 있습니다. 운영자는 신뢰할 수 있는 채널로 공개 키를 받아야 하며 캡처
69
+ 완전성도 계속 확인해야 합니다. 유효한 서명으로 침해되거나 불완전한 어댑터를
70
+ 감지할 수는 없습니다.
67
71
 
68
72
  ## 의존성 정책
69
73
 
@@ -14,7 +14,7 @@ TrustDex is a dependency-free Node.js CLI that separates observation, policy, ga
14
14
  4. The policy engine produces ALLOW, ASK, or BLOCK.
15
15
  5. A gate emits only the approved configuration.
16
16
  6. MCP snapshots, permission posture snapshots, provenance-permission binding snapshots, and signed trust records make later drift reviewable.
17
- 7. An explicitly supplied value-free runtime inventory can be reconciled with reviewed bindings; TrustDex does not discover or intercept the runtime.
17
+ 7. An explicitly supplied value-free runtime inventory can be authenticated with a short-lived Ed25519 producer attestation and reconciled with reviewed bindings; TrustDex does not discover or intercept the runtime.
18
18
 
19
19
  The gate is the enforcement boundary. Reports alone do not prevent an agent from loading an unreviewed extension.
20
20
 
@@ -35,6 +35,7 @@ The gate is the enforcement boundary. Reports alone do not prevent an agent from
35
35
  | src/posture.mjs | Value-free Claude/Codex permission posture snapshots and autonomy-expansion classification |
36
36
  | src/bindings.mjs | Value-free MCP source/provenance to automatic-tool-grant bindings and drift classification |
37
37
  | src/runtime-evidence.mjs | Explicit runtime inventory validation, effective-boundary reconciliation, and exposure drift |
38
+ | src/runtime-attestation.mjs | Ed25519 runtime-inventory producer signing, freshness, key-ID, and exact-inventory verification |
38
39
  | src/trust-record.mjs | Ed25519 review-record signing and verification |
39
40
  | src/review.mjs | Signed-baseline comparison |
40
41
 
@@ -46,6 +47,7 @@ The gate is the enforcement boundary. Reports alone do not prevent an agent from
46
47
  - Permission posture snapshots must omit source paths and setting values; new autonomy or changed policy semantics must require review.
47
48
  - Binding snapshots must omit permission specifiers and tool names; an automatic grant to ASK/BLOCK, wildcard expansion, provenance change, or ambiguous/unbound rule must never appear as safely bound.
48
49
  - Runtime evidence must reject raw tool lists and unexpected fields, block observed BLOCK/unconfigured servers, and treat newly observed servers or tool-count growth as reviewable expansion.
50
+ - Unauthenticated runtime evidence must never become `matched` or `restricted`; verified status requires an exact-inventory signature from the supplied pinned key that is unexpired and within configured freshness limits.
49
51
  - Unknown evidence must not become trust.
50
52
  - A blocking signal must not be lowered by provenance.
51
53
  - Unsupported security-relevant syntax must fail closed.
@@ -67,8 +69,10 @@ the tool implementation is safe or that the runtime loaded those files.
67
69
 
68
70
  Runtime evidence adds a third, opt-in projection supplied by an authorized adapter. Its
69
71
  contract contains server names and tool counts, not tool names, endpoints, paths, or
70
- credentials. The inventory digest authenticates internal state only; an operator must
71
- authenticate the producer and confirm completeness through a separate trusted channel.
72
+ credentials. A short-lived Ed25519 attestation can bind the exact inventory to a pinned
73
+ producer key. The operator must obtain that public key through a trusted channel and
74
+ still confirm capture completeness; a valid signature cannot detect a compromised or
75
+ incomplete adapter.
72
76
 
73
77
  ## Dependency policy
74
78
 
package/docs/CLAUDE.ko.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  TrustDex는 Claude Code 또는 Claude Desktop이 MCP JSON을 받기 전에 이를 검사할 수 있습니다. 설정 증거를 로컬에서 평가하고, MCP 서버를 시작하지 않으며, 설정을 업로드하지 않습니다. ALLOW 결정은 증거가 정책과 일치한다는 뜻이며 서버 코드가 안전하다는 것을 증명하지 않습니다.
8
8
 
9
- Claude 전용 명령은 TrustDex 0.5.0 이상에서 사용할 수 있습니다. 게시된 CLI를 실행하려면 아래 예제의 `node ./bin/trustdex.mjs` 대신 `npx trustdex@0.10.0`을 사용하거나, 소스 체크아웃에서 명령을 직접 사용하세요.
9
+ Claude 전용 명령은 TrustDex 0.5.0 이상에서 사용할 수 있습니다. 게시된 CLI를 실행하려면 아래 예제의 `node ./bin/trustdex.mjs` 대신 `npx trustdex@0.11.0`을 사용하거나, 소스 체크아웃에서 명령을 직접 사용하세요.
10
10
 
11
11
  ## 지원되는 설정
12
12
 
@@ -167,7 +167,9 @@ node ./bin/trustdex.mjs snapshot-claude-bindings ./.mcp.json \
167
167
  BLOCK 소스와 `.mcp.json`에 없는 서버는 결과를 차단하고, 검토가 필요한 연결이
168
168
  로드되면 계속 검토가 필요합니다. `diff-runtime-tools`는 새로 보이는 서버와 도구
169
169
  개수 증가를 감지합니다. TrustDex는 Claude를 호출하거나 세션 파일을 찾거나 어댑터를
170
- 인증하거나 인벤토리의 완전성을 증명하지 않습니다.
170
+ 자동으로 인증하거나 인벤토리의 완전성을 증명하지 않습니다. 운영 증거에는
171
+ [인증된 런타임 증거](RUNTIME_EVIDENCE.ko.md)에 나온 `sign-runtime-inventory`, 고정된
172
+ 생성자 공개 키, 제한된 `--max-age-seconds` 및 `--require-authenticated`를 사용하세요.
171
173
 
172
174
  ## 서명된 검토 및 드리프트
173
175
 
package/docs/CLAUDE.md CHANGED
@@ -10,7 +10,7 @@ upload your configuration. An ALLOW decision means the evidence matched your pol
10
10
  it does not prove that server code is safe.
11
11
 
12
12
  The Claude-specific commands are available in TrustDex 0.5.0 and later.
13
- Use `npx trustdex@0.10.0` in place of `node ./bin/trustdex.mjs` in the examples
13
+ Use `npx trustdex@0.11.0` in place of `node ./bin/trustdex.mjs` in the examples
14
14
  below to run the published CLI, or use the commands directly from a source checkout.
15
15
 
16
16
  ## Supported configuration
@@ -216,7 +216,10 @@ Then run `snapshot-runtime-tools <bindings> <inventory> --out <evidence>`. Loade
216
216
  sources and servers absent from `.mcp.json` block the result; loaded review-required
217
217
  bindings remain review-required. `diff-runtime-tools` detects newly visible servers and
218
218
  tool-count growth. TrustDex does not call Claude, discover session files, authenticate
219
- the adapter, or prove the inventory is complete.
219
+ the adapter automatically, or prove the inventory is complete. Production evidence
220
+ should use `sign-runtime-inventory`, a pinned producer public key, bounded
221
+ `--max-age-seconds`, and `--require-authenticated` as shown in
222
+ [Authenticated runtime evidence](RUNTIME_EVIDENCE.md).
220
223
 
221
224
  ## Signed review and drift
222
225
 
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.10.0 inspect-codex ~/.codex/config.toml --pack strict
18
+ npx trustdex@0.11.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.10.0 inspect-codex ~/.codex/config.toml --pack strict
25
25
  ### 2. 게이트된 사본 작성
26
26
 
27
27
  ```bash
28
- npx trustdex@0.10.0 gate-codex ~/.codex/config.toml \
28
+ npx trustdex@0.11.0 gate-codex ~/.codex/config.toml \
29
29
  --pack official-first \
30
30
  --trust-store ./trust-store.json \
31
31
  --out ./gated-config.toml
@@ -148,15 +148,17 @@ node ./bin/trustdex.mjs diff-bindings \
148
148
  `snapshot-runtime-tools <bindings> <inventory> --out <evidence>`로 검토된 Codex
149
149
  결합 스냅샷과 대조하고, `diff-runtime-tools`로 노출 확대를 게이트합니다. 이는 옵트인
150
150
  증거 어댑터 계약이며 자동 설정 탐색, 공식 Codex 내보내기 형식 또는 런타임 강제가
151
- 아닙니다. 캡처 경로와 샌드박스는 클라이언트에서 별도로 확인하세요.
151
+ 아닙니다. 캡처 경로와 샌드박스는 클라이언트에서 별도로 확인하세요. 운영 증거에는
152
+ [인증된 런타임 증거](RUNTIME_EVIDENCE.ko.md)에 나온 `sign-runtime-inventory`, 고정된
153
+ 생성자 공개 키, 제한된 `--max-age-seconds` 및 `--require-authenticated`를 사용하세요.
152
154
 
153
155
  ### 스킬 및 플러그인
154
156
 
155
157
  에이전트 스킬과 플러그인 매니페스트도 같은 방법으로 검사할 수 있습니다.
156
158
 
157
159
  ```bash
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
160
+ npx trustdex@0.11.0 inspect-skill ./path/to/SKILL.md --pack strict
161
+ npx trustdex@0.11.0 inspect-plugin ./path/to/plugin.json --pack strict
160
162
  ```
161
163
 
162
164
  이 명령은 파이프로 연결된 셸 설치 프로그램, 민감한 경로 참조, 네트워크 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.10.0 inspect-codex ~/.codex/config.toml --pack strict
18
+ npx trustdex@0.11.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.10.0 gate-codex ~/.codex/config.toml \
28
+ npx trustdex@0.11.0 gate-codex ~/.codex/config.toml \
29
29
  --pack official-first \
30
30
  --trust-store ./trust-store.json \
31
31
  --out ./gated-config.toml
@@ -165,15 +165,17 @@ the MCP server names visible to that session and a tool count for each server. R
165
165
  the reviewed Codex binding snapshot, and `diff-runtime-tools` to gate exposure growth.
166
166
  This is an opt-in evidence adapter contract, not automatic config discovery, an official
167
167
  Codex export format, or runtime enforcement. Confirm the capture path and sandbox in the
168
- client separately.
168
+ client separately. Production evidence should use `sign-runtime-inventory`, a pinned
169
+ producer public key, bounded `--max-age-seconds`, and `--require-authenticated` as shown
170
+ in [Authenticated runtime evidence](RUNTIME_EVIDENCE.md).
169
171
 
170
172
  ### Skills and plugins
171
173
 
172
174
  Agent skills and plugin manifests can be inspected the same way:
173
175
 
174
176
  ```bash
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
177
+ npx trustdex@0.11.0 inspect-skill ./path/to/SKILL.md --pack strict
178
+ npx trustdex@0.11.0 inspect-plugin ./path/to/plugin.json --pack strict
177
179
  ```
178
180
 
179
181
  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.
@@ -46,7 +46,7 @@ TrustDex는 이 표면에 대한 노출 전 통제를 연구하고 구현합니
46
46
  | 증거에서 비밀 값 제외 | 출력, 스냅샷 및 설정 지문에서 비밀 값을 제거하는 테스트 |
47
47
  | 승인 상태의 드리프트 표시 | 결정론적 스냅샷, Ed25519 검토 기록 및 재검사 명령 |
48
48
  | 소스 신뢰와 자동 권한 조정 | 값이 제거된 Claude/Codex 결합 스냅샷, 스키마, 차이 및 비활성 픽스처 |
49
- | 검토된 의도와 명시적 런타임 증거 비교 | 값 없는 인벤토리 계약, 실제 경계 대조 및 노출 드리프트 테스트 |
49
+ | 검토된 의도와 명시적 런타임 증거 비교 | 값 없는 인벤토리 계약, 수명이 짧은 Ed25519 생성자 증명, 실제 경계 대조 및 노출 드리프트 테스트 |
50
50
  | 공급망 모호성 감소 | 명시적 출처 관찰, 아티팩트 다이제스트 검증, 릴리스 체크섬, SBOM 및 빌드 증명 |
51
51
  | 연구 재현성 유지 | 비활성 픽스처, 문서화된 기대 결과, 크로스 플랫폼 CI 및 CodeQL |
52
52
 
@@ -66,9 +66,11 @@ ALLOW 결과는 여전히 관찰된 증거에 대한 정책 결과일 뿐입니
66
66
  증거이며 런타임 호출을 강제하지 않습니다.
67
67
 
68
68
  `snapshot-runtime-tools`는 권한이 있는 런타임 어댑터의 값 없는 인벤토리를 받아
69
- 해당 연결과 대조합니다. 도구 이름을 보관하지 않고 로드된 차단 소스와 예상 밖
70
- 서버를 드러낼 수 있습니다. 어댑터는 TrustDex 신뢰 경계 밖에 있으므로 신원, 전송
71
- 및 완전성에는 독립적인 통제가 필요합니다.
69
+ 해당 연결과 대조합니다. `sign-runtime-inventory`와 `verify-runtime-inventory`는
70
+ 짧은 만료와 선택적 캡처 나이 강제를 사용해 정확한 캡처를 고정된 Ed25519 생성자
71
+ 키에 연결합니다. 도구 이름을 보관하지 않고 로드된 차단 소스와 예상 밖 서버를
72
+ 드러낼 수 있습니다. 인증은 캡처 완전성을 증명하거나 침해된 어댑터를 보호하지
73
+ 않습니다. [인증된 런타임 증거](RUNTIME_EVIDENCE.ko.md)를 참고하세요.
72
74
 
73
75
  ## CVP 신청 경계
74
76
 
@@ -46,7 +46,7 @@ This work is defensive engineering. It does not require credential theft, persis
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
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 |
49
+ | Compare reviewed intent with explicit runtime evidence | value-free inventory contract, short-lived Ed25519 producer attestations, effective-boundary reconciliation, and exposure drift tests |
50
50
  | Reduce supply-chain ambiguity | explicit provenance observations, artifact digest verification, release checksums, SBOMs, and build attestations |
51
51
  | Keep research reproducible | inert fixtures, documented expectations, cross-platform CI, and CodeQL |
52
52
 
@@ -72,10 +72,12 @@ or blocked grants reviewable without retaining tool names or permission specifie
72
72
  It remains static evidence and does not enforce runtime calls.
73
73
 
74
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.
75
+ adapter and reconciles it with those bindings. `sign-runtime-inventory` and
76
+ `verify-runtime-inventory` bind the exact capture to a pinned Ed25519 producer key with
77
+ short expiry and optional capture-age enforcement. This can surface loaded blocked
78
+ sources and unexpected servers without retaining tool names. Authentication does not
79
+ prove capture completeness or protect a compromised adapter; see
80
+ [Authenticated runtime evidence](RUNTIME_EVIDENCE.md).
79
81
 
80
82
  ## CVP application boundary
81
83
 
@@ -104,13 +104,20 @@ Claude 및 Codex 자동 도구 권한과 연결합니다. 회귀 테스트는
104
104
  - 관찰된 ASK/광범위 권한 연결은 재검토
105
105
  - 설정되었지만 관찰되지 않은 서버는 제한적으로만 변경
106
106
  - 새로 관찰된 서버와 도구 개수 증가는 확대
107
+ - 노출이 일치해도 인증하지 않은 스키마 v2 인벤토리는 `needs-review` 유지
107
108
  - 원시 도구 목록, 중복 서버 이름, 예상 밖 필드, 잘못된 타임스탬프 및 변조된 증거는 안전하게 실패
108
109
  - 출력에는 서버 이름, 도구 개수, 고정 정책/출처 열거 값 및 다이제스트만 보관
109
110
 
110
- 픽스처는 어댑터 형태의 증거이지 실제 Claude 또는 Codex 캡처가 아닙니다. TrustDex는
111
- 인벤토리의 진위나 완전성을 판단할 수 없습니다. 배포 시 생성자와 전송을 별도로
112
- 보호해야 합니다. 값 없는 계약이 도구 이름을 의도적으로 제외하므로 도구 개수는
113
- 같고 집합만 바뀌는 대체는 감지할 수 없습니다.
111
+ `test/runtime-attestation.test.mjs`는 추가로 Ed25519 서명이 정확한 인벤토리,
112
+ 런타임 메타데이터, 생성자 키 ID, 생성 시각 및 만료를 연결하도록 요구합니다. 다른 키,
113
+ 변경된 인벤토리, 만료되거나 오래된 캡처, 과도한 수명 및 미래 시각 증거는 안전하게
114
+ 실패합니다. CLI 테스트는 비공개 키 자료를 출력하지 않고 인증된 대조만 `matched`에
115
+ 도달하도록 요구합니다.
116
+
117
+ 픽스처는 어댑터 형태의 증거이지 실제 Claude 또는 Codex 캡처가 아닙니다. 유효한
118
+ 생성자 서명은 전달된 바이트와 고정 키를 인증하지만 완전성이나 진실성을 증명하지
119
+ 않습니다. 값 없는 계약이 도구 이름을 의도적으로 제외하므로 도구 개수는 같고
120
+ 집합만 바뀌는 대체는 감지할 수 없습니다.
114
121
 
115
122
  ## 병합 설정 스택 사례
116
123
 
@@ -106,13 +106,20 @@ exercise the opt-in runtime inventory contract. They require:
106
106
  - an observed ASK/broad-grant binding to require review
107
107
  - configured but unobserved servers to be restriction-only
108
108
  - newly observed servers and tool-count growth to be expansion
109
+ - unauthenticated schema-v2 inventories to remain `needs-review` even when exposure matches
109
110
  - raw tool lists, duplicate server names, extra fields, invalid timestamps, and tampered evidence to fail closed
110
111
  - output to retain only server names, tool counts, fixed policy/provenance enums, and digests
111
112
 
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.
113
+ `test/runtime-attestation.test.mjs` additionally requires an Ed25519 signature to bind
114
+ the exact inventory, runtime metadata, producer key ID, creation time, and expiry. Wrong
115
+ keys, modified inventories, expired/stale captures, excessive lifetimes, and future-dated
116
+ evidence fail closed. The CLI test requires authenticated reconciliation to reach
117
+ `matched` without printing private-key material.
118
+
119
+ The fixture is adapter-shaped evidence, not a live Claude or Codex capture. A valid
120
+ producer signature authenticates the supplied bytes and pinned key, not completeness or
121
+ truthfulness. Same-count tool-set substitutions are invisible because the value-free
122
+ contract intentionally omits tool names.
116
123
 
117
124
  ## Merged settings stack cases
118
125