7.2 KiB
7.2 KiB
テスト妥当性レビュー: ticket
- 評価: 概ね良い
確認範囲
- 対象:
crates/ticket/ packageticket - 主要責務:
- 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
- typed Ticket domain API と
- 既存テスト:
src/lib.rsunit testssrc/config.rsunit testssrc/tool.rsasync 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 -> doneready/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
不足 / 疑問のあるテスト
TicketCreatetool の optionalstate入力に対する 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 にするのが望ましい。
追加候補
TicketCreatetool:{"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 にならないこと。
- large body / many events / many artifacts を作り、
- Lifecycle atomicity:
- invalid
TicketStateChangeを渡したmark_intake_readyが intake_summary だけを残さないこと。 TicketWorkflowStatetool の same-state transition rejection と no-mutation。
- invalid
- 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_ofnotices の outgoing/incoming view。
- duplicate/self/missing-target を
- Orchestration plan:
accepted_planmissing / accepted_plan supplied to non-accepted kind /waiting_capacity_notewithout 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 を変更しないこと。
- malformed JSON and invalid enum values return
実行したコマンド
cargo test -p ticket
結果:
66 passed; 0 failed; 0 ignored
doc-tests: 0 passed