T-ROTD-hook-matcher-row-says-which-destinations-honour-it
State: closed/done · Impact: medium · Complexity: medium
The hook form’s Event row already says, per destination, what happens to the chosen event: “Dropped by opencode, amp, github-copilot, portable. gemini-cli fires on AfterTool.” The Matcher row says nothing of the kind. An author cannot tell from the form which destinations read a matcher at all, which translate the tool names, and which ignore them.
| Location | Role today |
|---|---|
solutions/determined/experiences/agent-pants/app/components/ApFieldSections.vue (matcher row) | Description is only “Nothing named watches every tool call.” when the list is empty; no per-destination line |
solutions/determined/experiences/agent-pants/app/utils/hookNote.ts hookToolNames | Suggestions are the union of every destination’s tools claims, so a name one harness drops is still offered |
solutions/determined/experiences/agent-pants/app/utils/harnessGap.ts matcherCell | The gap table already computes a per-destination verdict for the whole matcher (honoured / translated / dropped / refused) from the same claims |
packages/rust/agent-adapt/src/render/hooks_json.rs | The one hook renderer; a destination that reads no hooks.json (opencode, amp) refuses every hook, so its matcher is moot |
Proposed
Section titled “Proposed”The Matcher row carries the same kind of description as the Event row, computed from the chosen tools and the note’s destinations: which destinations honour the names as typed, which translate them (and to what), which drop a name, and which refuse hooks altogether so the matcher never reaches them. Empty stays “Nothing named watches every tool call.”
Approach
Section titled “Approach”- Extract the per-destination matcher verdict from
harnessGap.ts(matcherCell) intohookNote.tsso the form and the gap table share it. - Render it as the Matcher row’s description, worded like the Event row’s
hookEventNote. - Unit tests in
ApFieldSections.test.tsbeside the Event row’s, one per verdict.
Success criteria
Section titled “Success criteria”- A matcher naming
Editwith destinations claude, opencode and github-copilot reads: honoured by claude, translated by opencode (edit), refused by github-copilot (no hooks). - A name no destination knows is said to be dropped by all of them.
- The gap table’s Matcher cell and the form’s description never disagree.
Found by the agent-pants bug survey, N-5LD4-bug-sweep-2026-09-12-agent-pants (the user’s review of the hook wizard on #2046).
Done in #2075.