118 lines
7.2 KiB
Markdown
118 lines
7.2 KiB
Markdown
# テスト妥当性レビュー: ticket
|
|
- 評価: 概ね良い
|
|
|
|
## 確認範囲
|
|
|
|
- 対象: `crates/ticket` / package `ticket`
|
|
- 主要責務:
|
|
- typed Ticket domain API と `.yoi/tickets/<ticket-id>/` local file backend
|
|
- Ticket lifecycle state, thread event, relation, orchestration-plan artifact の読み書き
|
|
- `.yoi/ticket.config.toml` の role/backend 設定解決
|
|
- LLM-facing Ticket tools の schema / bounded output / backend adapter
|
|
- 既存テスト:
|
|
- `src/lib.rs` unit tests
|
|
- `src/config.rs` unit tests
|
|
- `src/tool.rs` async unit tests
|
|
- 変更: なし。読解とテスト実行のみ。
|
|
|
|
## 現在のテストがよくカバーしている点
|
|
|
|
- `cargo test -p ticket` は成功しており、66 tests が通過している。
|
|
- backend の主要 happy path はかなり広く押さえられている:
|
|
- create / show / list 相当の local layout
|
|
- opaque canonical id
|
|
- `item.md`, `thread.md`, `artifacts/.gitkeep`, `resolution.md`
|
|
- obsolete frontmatter field を出さないこと
|
|
- Japanese record language の generated defaults
|
|
- numeric-looking YAML scalar の quoted round-trip
|
|
- lifecycle invariant のカバーは良い:
|
|
- `planning -> ready -> queued -> inprogress -> done`
|
|
- `ready/queued -> planning`
|
|
- disallowed transition rejection
|
|
- stale transition rejection
|
|
- generic `set_state_field` で `state` / `workflow_state` / `status` を変更できないこと
|
|
- `queue_ready` が non-ready Ticket を mutate しないこと
|
|
- thread event / doctor の基本検証は妥当:
|
|
- review status
|
|
- state_changed / intake_summary attributes
|
|
- invalid thread event attributes が append されないこと
|
|
- legacy bucket / obsolete fields / invalid state / malformed typed event の doctor diagnostics
|
|
- relation / orchestration-plan の重要点も押さえられている:
|
|
- forward relation storage
|
|
- inverse derived view
|
|
- dependency / incoming blocker が queue を止めること
|
|
- relation cycles / dangling target / self-target artifact を doctor が拾うこと
|
|
- orchestration plan JSONL append / query / invalid artifact detection
|
|
- config tests は fixed role config の方針に合っている:
|
|
- missing config defaults
|
|
- scaffold の全 role coverage
|
|
- backend-only config が role launch ready ではないこと
|
|
- unknown role / stale investigator role / unknown field rejection
|
|
- backend provider と legacy kind の扱い
|
|
- relative root resolution
|
|
- path-like profile selector rejection
|
|
- tool tests は LLM-facing surface として重要な bounded output を一部確認できている:
|
|
- tool name partitions
|
|
- generated schemas
|
|
- create/list/show/doctor flow
|
|
- list limit cap / title and hint truncation
|
|
- list が body/thread/artifact/resolution content を漏らさないこと
|
|
- workflow and relation tools の basic flow
|
|
|
|
## 不足 / 疑問のあるテスト
|
|
|
|
- `TicketCreate` tool の optional `state` 入力に対する output 整合性が未検証。実装上、backend には `params.state` を渡している一方、tool output は常に `"state": "planning"` を返しているため、`state: ready|queued|done|closed` で作成した場合の不一致をテストが捕まえられない。
|
|
- `TicketShow` の bounded output が十分に直接検証されていない。`event_limit`, `artifact_limit`, `body_max_bytes` の truncation と UTF-8 boundary safety は tool の安全性に直結するが、現状は list 側の bounded behavior の方が厚い。
|
|
- compound mutation の atomicity が一部未検証。特に `mark_intake_ready` は intake summary append と state transition が組み合わさるため、後段の state change validation 失敗時に partial event が残らないかをテストした方がよい。
|
|
- Markdown thread parser の body delimiter edge case が弱い。thread entry は `---` 行を区切りとしているため、event body に Markdown horizontal rule として `---` が含まれる場合の仕様がテストで固定されていない。
|
|
- relation API の negative cases は doctor artifact 手書き検査に寄っており、public backend API 経由の拒否が薄い:
|
|
- duplicate relation
|
|
- self-target relation
|
|
- missing target
|
|
- empty / multiline / oversized target, note, author
|
|
- dependency target が `done` / `closed` になった後は blocker ではなくなること
|
|
- `queued -> inprogress` 側の blocker enforcement は実装されているが、直接テストは薄い。`queue_ready` の blocker rejection はあるため大枠は安心だが、acceptance step としての `set_workflow_state(queued, inprogress)` でも同じ relation blocker が効くことを明示するとよい。
|
|
- config parser は代表的な rejection を持つが、top-level unknown field、unsupported profile source、`builtin:` のような empty registry name、absolute backend root の扱いは未固定。
|
|
- tool input validation の negative tests が少ない。invalid JSON、invalid enum、empty required text、same-state transition、invalid author/reason の error shape と no-mutation を追加すると tool boundary の信頼性が上がる。
|
|
- tests は private helpers / exact diagnostic substring にかなり依存している。これは file-backend crate では許容範囲だが、diagnostic wording 変更で壊れる brittle tests が一部ある。仕様として固定したい文言だけ exact assertion にするのが望ましい。
|
|
|
|
## 追加候補
|
|
|
|
- `TicketCreate` tool:
|
|
- `{"title": "...", "state": "ready"}` で作成し、tool output / `TicketShow` / `TicketList state=ready` が同じ state を返すこと。
|
|
- `TicketShow`:
|
|
- large body / many events / many artifacts を作り、`body_max_bytes`, `event_limit`, `artifact_limit` が count / returned / truncated を正しく返すこと。
|
|
- multibyte UTF-8 の truncation が invalid UTF-8 や panic にならないこと。
|
|
- Lifecycle atomicity:
|
|
- invalid `TicketStateChange` を渡した `mark_intake_ready` が intake_summary だけを残さないこと。
|
|
- `TicketWorkflowState` tool の same-state transition rejection と no-mutation。
|
|
- Thread parser:
|
|
- event body に quote, backslash, whitespace を含む attributes/body の round-trip。
|
|
- body 中の `---` 行を許すのか禁止するのかを仕様化し、期待動作をテスト。
|
|
- Relation:
|
|
- duplicate/self/missing-target を `add_ticket_relation` 経由で拒否するテスト。
|
|
- dependency target を `done` または `closed` にした後、queue / queued->inprogress が通ること。
|
|
- `supersedes` / `duplicate_of` notices の outgoing/incoming view。
|
|
- Orchestration plan:
|
|
- `accepted_plan` missing / accepted_plan supplied to non-accepted kind / `waiting_capacity_note` without note / oversized or multiline single-line fields。
|
|
- Config:
|
|
- unknown top-level field rejection。
|
|
- unsupported profile source and empty source-qualified profile name。
|
|
- absolute backend root が意図通り保持されること。
|
|
- Tool boundary:
|
|
- malformed JSON and invalid enum values return `ToolError::InvalidArgument`。
|
|
- mutating tools の invalid input が backend files を変更しないこと。
|
|
|
|
## 実行したコマンド
|
|
|
|
```sh
|
|
cargo test -p ticket
|
|
```
|
|
|
|
結果:
|
|
|
|
```text
|
|
66 passed; 0 failed; 0 ignored
|
|
doc-tests: 0 passed
|
|
|