{"id":52523,"plugin_id":"plugin_asdk_app_6acf71fcd9348191b432d98280f4b176","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-24T13:50:09.429Z","digest":"41b07667757fab6205a19117c41beb06885e9db0f9c7297ca9e05e47255d7fde","against":null,"payload":{"description":"Build a client hours report from TimeTackle - total hours per client, and per person for each client, for a billing period, as a ready-to-share table. Use when the user asks for client hours, a billing summary, or hours spent per client or account.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":408}],"name":"client-hours-report","skill_md_contents":"---\nname: client-hours-report\ndescription: Build a client hours report from TimeTackle - total hours per client, and per person for each client, for a billing period, as a ready-to-share table. Use when the user asks for client hours, a billing summary, or hours spent per client or account.\n---\n\n# Client hours report\n\nProduce a clean, shareable table of hours per client for a period. Explicit instructions from the user (period,\nclients, people, rounding, format) take priority over these steps.\n\n## Input\n\n- The billing period. If none is given, ask for it, offering last month as the default. Use exact `YYYY-MM-DD` dates.\n- Optionally specific clients, specific people, or a per-person breakdown.\n\n## Steps\n\n1. Call `get_account` and read `syncRange`. If the period reaches outside it, say that data only exists from\n   `syncRange.start` to `syncRange.end`.\n2. Find the client property: call `get_properties` with `search: \"Client\"`.\n   - If there is no match, try \"Account\" and \"Customer\", then ask the user which property holds clients; do not guess.\n   - Note its `key` and `state`. If the user asked about specific clients, check that those names appear among the\n     property's options (`children`); if a property has more options than returned, page with `parentId` and\n     `optionsOffset`.\n3. Call `get_meeting_analytics` with:\n   - `measures: [\"hours\"]`\n   - `groupBy: \"primary_tag\"` or `\"secondary_tag\"` (from the property's `state`), and `tagKey` set to its key\n   - `splitBy: \"user\"` when the user wants hours per person per client\n   - `dateFrom`, `dateTo`, and `timezone` (the user's, otherwise the `timezone` of their own calendar from\n     `get_imported_calendars`; say which one you used)\n4. Page with `offset` while `summary.nextOffset` is not null, and combine the rows.\n5. Keep only the clients (and people) the user asked for, if they named any.\n\n## Output\n\n- A table with one row per client, sorted by hours: client, hours (one decimal unless the user asks for another\n  rounding), share of the total. With a per-person breakdown, list each client's people under it with their hours,\n  or use a client × person table if it stays readable.\n- A total row, the exact period, and the timezone.\n- A note that time not tagged with a client is not included.\n- If the result has a `syncRangeWarning`, include it.\n\n## Do not\n\n- Do not calculate amounts, rates or invoices unless the user gives the rates; then show the calculation.\n- Do not invent clients or hours. If a requested client has no hours, show it with 0 and say so.\n- People are limited to those the user can access in TimeTackle.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}