{"id":16760,"plugin_id":"plugins_6a673f48f2dc81918fa9450b12f746be","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:13:45.782Z","digest":"67692fbb56ad0063f49710fbb2f2b462ef1e27c8ca62b47d097429dc203428fe","against":null,"payload":{"description":"Analyze GitHub or GitLab Issue flow for a requested period, focusing on two populations: Issues that changed from open to closed during the period and Issues that were still open at period end. Break both populations into mutually exclusive creation-age buckets of 0–7 days, 8–14 days, 15–30 days, and over 30 days; preserve labels and inspect delivery links for closures. Use for lightweight project progress reports, closure-flow reviews, open-backlog aging, weekly or monthly Issue summaries, and requests asking what was resolved versus what remains open.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":439},{"relative_path":"references/report-schema.md","size_in_bytes":2906}],"name":"infer-product-operations","skill_md_contents":"---\nname: infer-product-operations\ndescription: \"Analyze GitHub or GitLab Issue flow for a requested period, focusing on two populations: Issues that changed from open to closed during the period and Issues that were still open at period end. Break both populations into mutually exclusive creation-age buckets of 0–7 days, 8–14 days, 15–30 days, and over 30 days; preserve labels and inspect delivery links for closures. Use for lightweight project progress reports, closure-flow reviews, open-backlog aging, weekly or monthly Issue summaries, and requests asking what was resolved versus what remains open.\"\n---\n\n# Analyze Issue Flow\n\nTurn GitHub or GitLab Issue activity into a concise, evidence-backed progress report. Keep all access strictly read-only.\n\n## 1. Fix scope\n\n- Resolve the platform, instance hostname when self-managed, project namespace/name, requested time window, and reporting timezone.\n- Support GitHub.com, GitLab.com, and self-managed GitLab instances.\n- Default to the most recent 30 days when no window is given.\n- State exact start and end dates.\n- Analyze remote platform state only. Ignore local worktrees and local-only branches.\n\n## 2. Establish access\n\nDetermine visibility before requesting authentication.\n\n- For a public project, begin without authentication. Use public platform APIs and pages or public remote Git data.\n- For a private project, request authorization only when no existing authenticated connector, platform CLI (`gh` or `glab`), signed-in browser session, or suitable read-only token can provide access.\n- Treat `404`, `403`, sign-in redirects, and empty results as ambiguous until visibility and authentication are resolved.\n- Never expose credentials in commands, logs, reports, or URLs.\n\nPrefer sources in this order:\n\n1. Applicable authenticated connector or platform API.\n2. Existing authenticated `gh` or `glab` CLI.\n3. Existing signed-in browser session.\n4. Public platform pages or APIs for public projects.\n5. Ask the user to connect or authenticate only when necessary.\n\n## 3. Collect complete Issue data\n\nCollect and paginate all Issues needed to construct both status populations:\n\n- Every Issue that transitioned from open to closed inside the time window, including Issues created before the window.\n- Every Issue that is open at the end of the time window, including Issues created before the window.\n- Issue number, title, stable URL, author, created time, closed time, current state, and all labels.\n- Closing actor or reason when available.\n- Timeline/system events, linked branches, commits, pull/merge requests, cross-references, commit authors, and pull/merge request authors for closed Issues.\n\nDo not count pull/merge requests as Issues on GitHub endpoints that return both. On GitLab, include Issue-type work items and exclude tasks, incidents, epics, and other work-item types unless the user asks to include them.\n\nUse state-transition events when available. If the platform exposes only the current state and `closed_at`, treat a `closed_at` timestamp inside the period as the best available evidence of an open-to-closed transition and disclose the limitation. If an Issue was closed and then reopened before period end, include it in the closed population because the transition occurred and also in the open-at-end population; flag this overlap explicitly.\n\nReport incomplete pagination, disabled Issue features, inaccessible timelines, missing transition history, or permission-limited fields. Never describe inaccessible data as empty.\n\n## 4. Calculate the counts\n\nUse these two primary populations consistently:\n\n- **Open → Closed:** Issues with an open-to-closed transition inside the reporting period, regardless of creation date.\n- **Still Open:** Issues whose state is open at the reporting period end, regardless of creation date.\n\nBreak each population into mutually exclusive creation-age buckets measured from the period-end timestamp:\n\n- **近 1 周:** created 0–7 elapsed days before period end.\n- **近 2 周:** created more than 7 and no more than 14 elapsed days before period end.\n- **近 1 个月:** created more than 14 and no more than 30 elapsed days before period end.\n- **1 个月前:** created more than 30 elapsed days before period end.\n\nUse timestamp differences rather than calendar labels. State the bucket boundaries in the report. The four bucket counts must sum to the population total, except that an Issue may appear once in each population when it was closed and later reopened during the period.\n\nFor labels:\n\n- Show label distribution separately for Open → Closed and Still Open.\n- Count each Issue once under every label it carries within its population.\n- State that label totals can exceed the Issue total.\n- Group Issues without labels under “No label” or the natural equivalent in the user’s language.\n- Preserve platform label names exactly.\n\nDo not rank people or equate Issue count with performance. If author fields appear in details, treat them as attribution only.\n\n## 5. Resolve closed-Issue delivery links\n\nFor every Issue in the Open → Closed population, inspect its timeline, system events, development links, referenced commits, and associated pull/merge requests. Classify the strongest available relationship:\n\n1. **Direct link — high confidence**\n   - A commit or pull/merge request uses a supported closing keyword with the Issue reference.\n   - A system event explicitly says the commit or pull/merge request closed the Issue.\n   - The platform exposes an explicit closing relationship.\n\n2. **Explicit mention — medium confidence**\n   - A commit or pull/merge request explicitly references the Issue but does not establish that it closed or fully resolved it.\n\n3. **Inferred candidate — low confidence**\n   - No explicit reference exists, but the timing and change content plausibly match.\n   - Use only when a representative diff was inspected.\n   - Describe it as a possible relationship, never as the closing commit.\n\n4. **No delivery link found**\n   - The Issue was manually closed, closed as duplicate/wontfix, resolved outside the repository, or lacks visible linkage.\n\nWhen a pull/merge request closes the Issue, report both the pull/merge request and its merge commit when available. When several commits contribute, do not arbitrarily choose one.\n\nFor every reported commit or pull/merge request, show the platform-visible person name:\n\n- For a commit, use the commit author name. If author and committer differ materially, show both with clear roles.\n- For a pull/merge request, use the pull/merge request author. Do not substitute the merger or reviewer unless separately identified.\n- When several linked delivery items have different people, map each person to the corresponding commit or pull/merge request.\n- Write “Unknown” when the platform does not expose a name. Do not infer identity from an email address.\n\nAlso show the author of each Open → Closed Issue in the delivery table as “Issue 提交人.” Keep Issue authorship separate from delivery attribution. Put commits and pull/merge requests in separate columns, but combine their people in one “交付人” column. Deduplicate the same person; when the people differ, label their roles, such as “Name A（Commit）、Name B（PR）.”\n\n## 6. Disclose omissions\n\nNever silently skip a required action. If anything prescribed by this skill was not completed, add one concise sentence at the end of the report stating what was not completed, why, and how it may affect the conclusion. Do not create a separate omissions section or table.\n\nDo not use brevity, corpus size, or inconvenience alone as a reason to omit required analysis. If the corpus is large, use pagination or batching. When partial completion is unavoidable, state the completed coverage numerically.\n\n## 7. Produce the report\n\nRead [report-schema.md](references/report-schema.md) and follow it exactly. Write in the user’s language unless requested otherwise. Keep the report concise.\n\nUse stable Issue, commit, and pull/merge request links. Separate observed facts from inferred candidates. Do not invent missing authors, labels, closure reasons, commits, or delivery relationships.\n\n## Quality check\n\n- Exact project, platform, dates, timezone, and coverage are visible.\n- Open → Closed and Still Open populations are both collected.\n- Every page is covered or the gap is disclosed.\n- Issue, age-bucket, label, and closure counts use the defined rules.\n- Issues created before the window are not omitted from either population.\n- The four creation-age buckets are mutually exclusive and sum to each population total.\n- Reopened Issues that belong to both populations are explicitly identified.\n- Issue-type filtering is correct for the platform.\n- Label double-counting behavior is disclosed.\n- Every closed Issue has a delivery-link classification.\n- Every closed Issue with a direct, explicit, or inferred delivery relationship includes its Issue author as “Issue 提交人.”\n- Commit and pull/merge request links use separate columns, while their people share one deduplicated “交付人” column.\n- Every reported commit or pull/merge request includes its visible author name or “Unknown.”\n- Direct, explicit, inferred, and absent links are not conflated.\n- “No delivery link found” is counted in the summary but its Issues are not listed in the delivery table.\n- Every unperformed required action is disclosed in one concise sentence with its reason and impact.\n- No individual productivity ranking appears.\n- No secrets or unnecessary personal data are reproduced.\n- No external state is modified.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}