CawPlan UX Tracking
Bootstrap
cawplan skill check
Background
Tickets have ux values NOT_REQUIRED, PENDING, and READY; only PENDING needs UX follow-up.
Use cawplan tickets search, not tickets poll, because poll does not return ux.
Every workflow passes --excluded_status_categories COMPLETE,CANCELED: UX can remain PENDING after a ticket closes. Use category filters, not product-line-specific status keys.
UX queries need the full window:
--start_date 2000-01-01 --end_date <today>
Pagination: increment page_num while page_num * page_size < total; use total as the completion signal.
Entry Routing
| Input |
Flow |
| A specific product + version ("这个版本需要UX跟进的ticket") |
A — Version scope |
| A specific product, no version given, not framed by priority or team |
A — Version scope, but ask the user whether they mean a specific version or all versions of the product — "all versions" runs Workflow A step 2 with --product_ids and no --version_ids, no priority filter added (that's Workflow B's filter, not applicable here just because the version was dropped) |
| High-priority + no specific version, or explicitly cross-version |
B — Priority scope |
| A Team / product line ("某个team尚未提供UX的清单") |
C — Team scope |
| A product's UX members' design completion ("汇总 CawCut Cloud UX Team 本周的 UX 完成情况") |
D — Product UX completion |
Workflow A — Version scope
Resolve product + version (same pattern as cawplan-plan-track steps 1-2):
cawplan products list --search "<product name>"
cawplan versions list <product_id>
The supplied product must be an exact accessible-name match (case-insensitive after trimming whitespace), a unique short-form/token-prefix match, or a candidate the user explicitly confirms. If no unique match exists, show the candidates and ask which product they mean before listing versions or querying tickets; never use the closest product name.
Fetch:
cawplan tickets search --version_ids <version_id> --ux PENDING --excluded_status_categories COMPLETE,CANCELED --start_date 2000-01-01 --end_date <today> --page_size 100 --page_num 1
Page through fully (see Pagination above).
For "all versions of this product" (per Entry Routing), drop --version_ids and use --product_ids <product_id> instead — everything else in this step is unchanged, and no priority filter is added just because there's no version.
Workflow B — Priority scope
- If the user gave a product/version, resolve it the same way as Workflow A and add
--product_ids/--version_ids. If they didn't, ask whether to scope to a product or search across everything they have access to — don't silently assume "everything."
- Fetch:
cawplan tickets search --priority CRITICAL,HIGH --ux PENDING --excluded_status_categories COMPLETE,CANCELED --start_date 2000-01-01 --end_date <today> --page_size 100 --page_num 1 [--product_ids <id>] [--version_ids <id>]
Page through fully (see Pagination above), then sort CRITICAL → HIGH.
Workflow C — Team scope
- Resolve the Team name to a
product_line_id — same pattern as cawplan-product-report's Team workflow: cawplan product-lines list --page_size 100, match by name client-side. Require an exact name match (case-insensitive after trimming whitespace), a unique short-form/token-prefix match, or explicit user confirmation of a candidate. Ask to disambiguate on multiple matches; if no unique name match exists, list candidates and ask which Team the user means rather than guessing the closest one.
- Fetch:
cawplan tickets search --product_line_ids <product_line_id> --ux PENDING --excluded_status_categories COMPLETE,CANCELED --start_date 2000-01-01 --end_date <today> --page_size 100 --page_num 1
Page through fully (see Pagination above), then sort CRITICAL → HIGH → MEDIUM → LOW.
Workflow D — Product UX completion
UX Team here means the product's configured members.designers roster, not a CawPlan product
line. If the product is omitted, ask which product's UX members should be reported.
- Resolve the product and complete the product-access gate used by Workflow A:
cawplan products list --search "<product name or product_id>"
Read the matched product's members.designers[] roster and collect its user_id values and
display names. If it has no Designers, report that the product has no configured UX roster and
stop. Membership is product-scoped; use this returned roster, not a workspace-wide keyword
search. Default the date window to the current week only when the user does not provide one.
- Fetch candidates that currently need or have completed UX. Exclude
NOT_REQUIRED tickets
with --ux PENDING,READY; NOT_REQUIRED is the default state and does not represent UX work.
Do not add terminal-status exclusions: a Ticket may have been marked READY in the
requested window and later edited, closed, or moved back to PENDING.cawplan tickets search --product_ids <product_id> --ux PENDING,READY --start_date 2000-01-01 --end_date <today> --updated_start_date <window_start> --updated_end_date <today> --page_size 100 --page_num 1
Page through fully (see Pagination above). updated_at only produces candidates; it is not UX
completion evidence.
- For every candidate, fetch
cawplan tickets history <product_id> <version_id> <ticket_id>.
Keep only an UPDATED history entry whose changed_fields.ux changes to READY, whose
created_at is inside the requested window, and whose history-entry user_id is in the
product's members.designers roster. The field can be the string READY or an object with a
new value; support both. Do not count a Ticket because its current ux is READY, because
it is assigned to a Designer, or because a non-Designer changed its UX field.
- Deduplicate by Ticket, retaining its latest in-window UX-Ready event. Group the retained
Tickets by that history entry's actor (
user_id / user_display_name): this actor is the
product roster's Designer who completed the UX work. Never group, count, or infer the
Designer from the Ticket's reporter or ordinary assignees.
Output
- One row per matching ticket: display ID, title, type, priority, product/version, assignee.
- Workflow B/C: sorted by priority descending, as above.
- State the search window and that terminal categories are excluded.
- If nothing matches, say so plainly — don't return an empty table with no comment.
- For Workflow D, show each configured Designer's UX-Ready ticket count and the Ticket list
(display ID, title, product/version, UX-Ready timestamp). State the requested window, the
product used for the UX roster, and that counts are based on history-verified
ux → READY events.
References
references/CAWPLAN_OPEN_API.md
1---2name: cawplan-ux-tracking3description: Find CawPlan tickets that need UX attention, or summarize a product's UX members' design completion: pending UX for a version, high-priority tickets missing UX design, a Team's UX-pending queue, or tickets that product's Designers marked UX Ready in a date range. Use when: the user asks which tickets need UX follow-up/review/spec for a version, which high-priority tickets need UX but don't have a design yet, which Team hasn't had UX provided for its tickets, or asks for a product's UX members' UX/design completion summary. NOT for: creating or updating tickets, setting a ticket's UX status, general ticket search, or release tracking (use `cawplan-plan-track` for version release health).4---56# CawPlan UX Tracking78## Bootstrap910```bash11cawplan skill check12```1314## Background1516Tickets have `ux` values `NOT_REQUIRED`, `PENDING`, and `READY`; only `PENDING` needs UX follow-up.1718Use `cawplan tickets search`, not `tickets poll`, because poll does not return `ux`.1920Every workflow passes `--excluded_status_categories COMPLETE,CANCELED`: UX can remain `PENDING` after a ticket closes. Use category filters, not product-line-specific status keys.2122UX queries need the full window:23```24--start_date 2000-01-01 --end_date <today>25```2627**Pagination**: increment `page_num` while `page_num * page_size < total`; use `total` as the completion signal.2829## Entry Routing3031| Input | Flow |32|---|---|33| A specific product + version ("这个版本需要UX跟进的ticket") | **A — Version scope** |34| A specific product, no version given, not framed by priority or team | **A — Version scope**, but ask the user whether they mean a specific version or all versions of the product — "all versions" runs Workflow A step 2 with `--product_ids` and no `--version_ids`, **no priority filter added** (that's Workflow B's filter, not applicable here just because the version was dropped) |35| High-priority + no specific version, or explicitly cross-version | **B — Priority scope** |36| A Team / product line ("某个team尚未提供UX的清单") | **C — Team scope** |37| A product's UX members' design completion ("汇总 CawCut Cloud UX Team 本周的 UX 完成情况") | **D — Product UX completion** |3839## Workflow A — Version scope40411. Resolve product + version (same pattern as `cawplan-plan-track` steps 1-2):42 ```bash43 cawplan products list --search "<product name>"44 cawplan versions list <product_id>45 ```46 The supplied product must be an exact accessible-name match (case-insensitive after trimming whitespace), a unique short-form/token-prefix match, or a candidate the user explicitly confirms. If no unique match exists, show the candidates and ask which product they mean before listing versions or querying tickets; never use the closest product name.472. Fetch:48 ```bash49 cawplan tickets search --version_ids <version_id> --ux PENDING --excluded_status_categories COMPLETE,CANCELED --start_date 2000-01-01 --end_date <today> --page_size 100 --page_num 150 ```51 Page through fully (see Pagination above).5253 For "all versions of this product" (per Entry Routing), drop `--version_ids` and use `--product_ids <product_id>` instead — everything else in this step is unchanged, and no priority filter is added just because there's no version.5455## Workflow B — Priority scope56571. If the user gave a product/version, resolve it the same way as Workflow A and add `--product_ids`/`--version_ids`. If they didn't, ask whether to scope to a product or search across everything they have access to — don't silently assume "everything."582. Fetch:59 ```bash60 cawplan tickets search --priority CRITICAL,HIGH --ux PENDING --excluded_status_categories COMPLETE,CANCELED --start_date 2000-01-01 --end_date <today> --page_size 100 --page_num 1 [--product_ids <id>] [--version_ids <id>]61 ```62 Page through fully (see Pagination above), then sort `CRITICAL` → `HIGH`.6364## Workflow C — Team scope65661. Resolve the Team name to a `product_line_id` — same pattern as `cawplan-product-report`'s Team workflow: `cawplan product-lines list --page_size 100`, match by name client-side. Require an exact name match (case-insensitive after trimming whitespace), a unique short-form/token-prefix match, or explicit user confirmation of a candidate. Ask to disambiguate on multiple matches; if no unique name match exists, list candidates and ask which Team the user means rather than guessing the closest one.672. Fetch:68 ```bash69 cawplan tickets search --product_line_ids <product_line_id> --ux PENDING --excluded_status_categories COMPLETE,CANCELED --start_date 2000-01-01 --end_date <today> --page_size 100 --page_num 170 ```71 Page through fully (see Pagination above), then sort `CRITICAL` → `HIGH` → `MEDIUM` → `LOW`.7273## Workflow D — Product UX completion7475UX Team here means the product's configured `members.designers` roster, not a CawPlan product76line. If the product is omitted, ask which product's UX members should be reported.77781. Resolve the product and complete the product-access gate used by Workflow A:79 ```bash80 cawplan products list --search "<product name or product_id>"81 ```82 Read the matched product's `members.designers[]` roster and collect its `user_id` values and83 display names. If it has no Designers, report that the product has no configured UX roster and84 stop. Membership is product-scoped; use this returned roster, not a workspace-wide keyword85 search. Default the date window to the current week only when the user does not provide one.862. Fetch candidates that currently need or have completed UX. Exclude `NOT_REQUIRED` tickets87 with `--ux PENDING,READY`; `NOT_REQUIRED` is the default state and does not represent UX work.88 Do **not** add terminal-status exclusions: a Ticket may have been marked `READY` in the89 requested window and later edited, closed, or moved back to `PENDING`.90 ```bash91 cawplan tickets search --product_ids <product_id> --ux PENDING,READY --start_date 2000-01-01 --end_date <today> --updated_start_date <window_start> --updated_end_date <today> --page_size 100 --page_num 192 ```93 Page through fully (see Pagination above). `updated_at` only produces candidates; it is not UX94 completion evidence.953. For every candidate, fetch `cawplan tickets history <product_id> <version_id> <ticket_id>`.96 Keep only an `UPDATED` history entry whose `changed_fields.ux` changes to `READY`, whose97 `created_at` is inside the requested window, and whose history-entry `user_id` is in the98 product's `members.designers` roster. The field can be the string `READY` or an object with a99 `new` value; support both. Do not count a Ticket because its current `ux` is `READY`, because100 it is assigned to a Designer, or because a non-Designer changed its UX field.1014. Deduplicate by Ticket, retaining its latest in-window UX-Ready event. Group the retained102 Tickets by that history entry's actor (`user_id` / `user_display_name`): this actor is the103 product roster's **Designer who completed the UX work**. Never group, count, or infer the104 Designer from the Ticket's reporter or ordinary assignees.105106## Output107108- One row per matching ticket: display ID, title, type, priority, product/version, assignee.109- Workflow B/C: sorted by priority descending, as above.110- State the search window and that terminal categories are excluded.111- If nothing matches, say so plainly — don't return an empty table with no comment.112- For Workflow D, show each configured Designer's UX-Ready ticket count and the Ticket list113 (display ID, title, product/version, UX-Ready timestamp). State the requested window, the114 product used for the UX roster, and that counts are based on history-verified115 `ux → READY` events.116117## References118119- `references/CAWPLAN_OPEN_API.md`