# Reported issues for PDF Verify (PDF Agent Stack)

Pod holds 11 of 11 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [PDF Verify (PDF Agent Stack)](/mcp/pdf-verify-pdf-agent-stack).

## Most discussed

### evaluate_policy の advisory 穴 2 件（V-A1 非認証署名の後続変更 / V-A2 非PAdES署名）— v0.7.1 で修正済み

> [!NOTE]
> **記録用 issue。修正が先行しているため起票と同時にクローズする。**
> ④（Skill 見直し + 実連携）の pdf-trust 実連携で発見し、**v0.7.1 で修正・公開済み**（commit `1ec5acf`・npx 公開版で確認済み）。
> 出典: [`docs/FINDINGS-2026-07-20.md`](../docs/FINDINGS-2026-07-20.md)。

## 概要

`evaluate_policy` の advisory に 2 件の穴があった。**どちらも「判定が間違っている」のではなく「判定に必要な事実が呼び出し側に出ない／ルールが素通りする」**。
結果として Skill（LLM）が不足分を自力で補いたくなる＝「ジャッジはコード、ナラティブは LLM」という委譲設計が壊れる方向の圧力になっていた。engine 側で塞ぐのが筋。

**両件とも verdict は不変。advisory と返却 facts の追加のみで、決定論ルールエンジンには触れていない。**

## V-A1 —…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/10) · 2026-07-24 · closed · 1 comment

### evaluate_policy の openWorldHint が false のまま（check_revocation: "online" で外部に問い合わせる）

**確認した版: 0.28.0**

## 食い違い

- `src/tools/evaluate-policy.ts` 111 行の `annotations` は `openWorldHint: false`
- しかし `evaluate_policy` は `check_revocation` を受け取り、内部で `verifySignatures` を呼ぶ。`"online"` のときは、OCSP レスポンダ・CRL 配布点・AIA caIssuers へ HTTP で問い合わせる（0.28.0 からは中間 CA の分も）
- `verify_signatures` は同じ理由で `openWorldHint: true`（`src/tools/verify-signatures.ts` 91 行、コメント「check_revocation='online' may reach OCSP/CRL endpoints」）
- ツール説明にも「`"online"` (queries OCSP/CRL endpoints over HTTP)」と書いてある
-…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/19) · 2026-09-17 · closed · 0 comments

### response_format: json の出力が 25,000 文字で切り詰められ、JSON として読めなくなる

**確認した版: 0.28.0（npm 公開版）/ 2026-09-17 に #16 の A/B で見つけた。0.27.0 でも同じ**

## 起きたこと

各ツールは本文を `truncateIfNeeded`（`src/utils/formatter.ts` 19 行）に通す。`CHARACTER_LIMIT`（`src/constants.ts` 6 行、25,000）を超えると先頭 25,000 文字に `\n\n…(truncated)` を足して返す。`response_format: "json"` でも同じ処理なので、**途中で切れた JSON が返る**。`isError` は false のままで、呼び出し側は `JSON.parse` で失敗するまで気づけない。

## 実測（esig/dss の検証用 PDF、0.28.0 を MCP 越しに呼んだ）

| 検体 | ツール | 本文の長さ | JSON として読めるか |
| --- | --- | --- | --- |
| `51sigs.pdf`（署名 51 個、4.6 MB） |…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/18) · 2026-09-17 · closed · 0 comments

### scripts/golden.mjs が validate_conformance の skippedRules（数値）を配列として扱い、take が途中で落ちる

**確認した版: 0.28.0 / 2026-09-17 に #16 の A/B で見つけた**

## 起きたこと

esig/dss の PAdES 検証用 PDF（`dss-pades/src/test/resources/validation/`）を `--set` に渡すと、`node scripts/golden.mjs take` が次の例外で終了し、ゴールデンが書き出されない。

```
file:///.../scripts/golden.mjs:249
TypeError: (raw.skippedRules ?? []).map is not a function
```

## 原因

- `scripts/golden.mjs` 249 行は `skippedRules` を配列として読む: `skipped: (raw.skippedRules ?? []).map((v) => v.ruleId ?? v).sort()`
- 実装の `skippedRules`…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/17) · 2026-09-17 · closed · 0 comments

### 失効情報の thisUpdate と検証時刻の前後関係を検査する（#13 から分離）

**#13 から分けた残り。許容幅は実物の検体で測ってから決める。**

## 現在の動作（#13 の実装後）

- CRL / OCSP の `nextUpdate` が検証時刻（`validationTime`）より前なら、`good` を `unknown` にする
- `thisUpdate` と検証時刻の前後関係は見ていない。検証時刻より前に発行された失効情報でも `good` の根拠にしている

## 決めること

「検証時刻に失効していなかった」と言うには、本来は検証時刻以降に発行された失効情報が要る。一方、署名の直前に取得して CMS や DSS に入れた OCSP 応答は、`thisUpdate` が署名タイムスタンプより数分早いのが普通。厳密にすると多くの実物で `good` が `unknown` に変わる。

- 許容幅を設けるか、設けるなら何分か
- 文書タイムスタンプを検証時刻にした場合（B-LTA）の扱い

## 先に測るもの

- pdf-agent-stack の…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/16) · 2026-09-17 · closed · 0 comments

### 埋め込み失効情報の読み取り範囲が、出力の説明と合っていない

**確認した版: 0.26.1（commit c88e9f4）**

## 現在の動作

`src/services/verification-service.ts` 207〜208 行:

```ts
const embeddedOcsps = dssOcsps;
const embeddedCrls = [...artifacts.crls, ...dssCrls];
```

- OCSP 応答は DSS からだけ読む
- CRL は、DSS と CMS `SignedData.crls` から読む
- CMS の署名属性 `adbe-revocationInfoArchival`（OID 1.2.840.113583.1.1.8、Adobe が定義した失効情報の属性）は読んでいない（`src` に OID の参照は 0 件）

一方、`revocation.ts` 413 行の `detail` は `'Embedded OCSP response (DSS/CMS)'` で、CMS の OCSP も読んでいるように見える。

## 仕様

ISO 32000-2…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/15) · 2026-09-17 · closed · 0 comments

### `revocation.status` の `not_checked` が一度も出力されない

**確認した版: 0.26.1（commit c88e9f4）**

## 現在の動作

- `RevocationStatus.NOT_CHECKED = 'not_checked'` は定義されている（`src/constants.ts` 138 行）
- しかし、これを返すコードが無い。`check_revocation: "none"` のときは `checkRevocation` を呼ばず、`report.revocation` は `null` のまま（`verification-service.ts` 88 行・236 行）
- 参照しているのは `policy-engine.ts` 250 行の比較だけ。この比較は、実際には一度も真にならない

## 値が書かれている箇所

| 箇所 | 記述 |
| --- | --- |
| `src/tools/verify-signatures.ts` 68 行（ツールの description） | `revocation status ('good' / 'revoked' / 'unknown' /…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/14) · 2026-09-17 · closed · 0 comments

### 失効日時と署名時刻を比べずに `revoked` → `invalid` にしている

**確認した版: 0.26.1（commit c88e9f4）/ 判定結果が変わる変更**

## 現在の動作

`checkRevocation`（`src/services/revocation.ts` 393 行〜）は、OCSP 応答の `certStatus` が revoked、または CRL に証明書のシリアル番号が載っていれば、`RevocationStatus.REVOKED` を返す。失効日時（OCSP の `revocationTime`、CRL の `revocationDate`）は読んでいない（`revocation.ts` に両フィールドの参照は 0 件）。

`verification-service.ts` 244〜248 行は、`REVOKED` を受け取ると無条件で `verdict = invalid` にする。

その結果、次の署名もすべて `invalid` になる。

- 署名タイムスタンプ（B-T）で署名時刻が証明されていて、その**後に**証明書が失効した署名
- DSS…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/13) · 2026-09-17 · closed · 0 comments

## Most recent

### 証明書チェーンの基準時刻に、署名者が書いた `signingTime` をタイムスタンプより優先して使っている

**確認した版: 0.26.1（commit c88e9f4）/ 判定結果が変わる変更**

## 現在の動作

`src/services/verification-service.ts` 209〜211 行:

```ts
const checkDate =
  artifacts.signingTime ??
  (cms.signatureTimestamp?.genTime ? new Date(cms.signatureTimestamp.genTime) : new Date());
```

`evaluateTrust` は、この `checkDate` で証明書の有効期間を判定する。順序は次のとおり。

1. CMS の `signingTime` 署名属性（署名者が自分で書く値）
2. 署名タイムスタンプの `genTime`（TSA が証明する値）
3. 実行時刻

## 問題

- `signingTime` は、署名者が任意の値を書ける。期限切れの証明書で署名し、`signingTime` を有効期間内の日付にすると、チェーン評価が通る
-…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/12) · 2026-09-17 · closed · 0 comments

### verify_integrity にリビジョン間のオブジェクト単位差分を追加する（どのオブジェクトが変わったか）

## ギャップ

`verify_integrity` は改ざん検知の**構造的事実**までは返すが、**「どのオブジェクトが書き換わった／追加されたか」は返さない**。

現状の出力: リビジョン数（`incrementalUpdateCount`）・署名範囲外のバイト追加（`signaturesWithLaterChanges`）・
`lastSignatureCoversFile`・DocMDP 権限違反。

「署名後に 574 バイト足された」までは分かるが、それが**どのオブジェクト（注釈？ フォーム値？ ページ内容？）**なのかは分からない。
`specs/12-use-cases.md` UC-10（改ざん箇所のオブジェクト単位ピンポイント指摘）の前提が欠けている。

## 提案

増分更新の xref を隣接リビジョン間で比較し、**変更 / 追加 / 削除されたオブジェクトの一覧**（可能なら型: Annot / AcroForm field / Page content 等）を返す。

- **verdict は動かさない**。増分更新は PDF…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/8) · 2026-07-24 · closed · 0 comments

### 暗号化 PDF（未復号）で PDF/UA 構造系規則が誤 fail する

# 暗号化 PDF（未復号）で PDF/UA 構造系規則が誤 fail する

## 症状

`validate_conformance`（flavour: `pdfua-1`, engine: `native`）をパスワード保護された（未復号の）PDF に対して実行すると、実際にはタグ付き（`/StructTreeRoot` あり）の文書でも次の誤判定が出る（v0.6.2 で確認、v0.6.2 以前から存在）:

- `ua-struct-tree` が「No /StructTreeRoot in the catalog」で **error fail** → `compliant: false` に直結
- `ua-images-tagged` / `ua-link-contents` が「Rule check errored: Expected instance of PDFDict, but got instance of undefined」

## 原因

pdf-lib を `ignoreEncryption: true` で load…

[Read the thread](https://github.com/shuji-bonji/pdf-verify-mcp/issues/7) · 2026-07-19 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/shuji-bonji/pdf-verify-mcp/issues).
