-
Notifications
You must be signed in to change notification settings - Fork 296
docs: add missing required sections to 7 safe output types (REQ-002) #17417
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -2030,6 +2030,15 @@ safe-outputs: | |||||||||||||||||||||||||
| 3. **No Side Effects**: Creates no GitHub resources. | ||||||||||||||||||||||||||
| 4. **Transparency**: Provides clear indication of normal completion vs. error states. | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **Configuration Parameters**: | ||||||||||||||||||||||||||
| - `max`: Operation limit (always 1; noop is registered as a singleton type) | ||||||||||||||||||||||||||
| - `message`: Default completion message (overridden by agent-provided message at invocation time) | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **Security Requirements**: | ||||||||||||||||||||||||||
| - The `message` field MUST undergo content sanitization to prevent log injection | ||||||||||||||||||||||||||
| - The handler MUST NOT make any GitHub API calls | ||||||||||||||||||||||||||
| - The handler MUST NOT modify any workflow state or create side effects | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **Required Permissions**: | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| *GitHub Actions Token*: | ||||||||||||||||||||||||||
|
|
@@ -2057,6 +2066,53 @@ This section provides complete definitions for all remaining safe output types. | |||||||||||||||||||||||||
| **Cross-Repository Support**: Yes | ||||||||||||||||||||||||||
| **Mandatory**: No | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **MCP Tool Schema**: | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ```json | ||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||
| "name": "update_issue", | ||||||||||||||||||||||||||
| "description": "Update an existing GitHub issue's status, title, body, labels, assignees, or milestone. Only the fields you specify will be updated; other fields remain unchanged.", | ||||||||||||||||||||||||||
| "inputSchema": { | ||||||||||||||||||||||||||
| "type": "object", | ||||||||||||||||||||||||||
| "properties": { | ||||||||||||||||||||||||||
| "status": {"type": "string", "enum": ["open", "closed"], "description": "New issue status"}, | ||||||||||||||||||||||||||
| "title": {"type": "string", "description": "New issue title"}, | ||||||||||||||||||||||||||
| "body": {"type": "string", "description": "New issue body in Markdown"}, | ||||||||||||||||||||||||||
| "issue_number": {"type": ["number", "string"], "description": "Issue number to update"}, | ||||||||||||||||||||||||||
| "operation": { | ||||||||||||||||||||||||||
| "type": "string", | ||||||||||||||||||||||||||
| "enum": ["replace", "append", "prepend", "replace-island"], | ||||||||||||||||||||||||||
| "description": "Body update mode (default: append)" | ||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||
| "labels": {"type": "array", "items": {"type": "string"}, "description": "Replacement label list"}, | ||||||||||||||||||||||||||
| "assignees": {"type": "array", "items": {"type": "string"}, "description": "Replacement assignee list"}, | ||||||||||||||||||||||||||
| "milestone": {"type": ["number", "string"], "description": "Milestone number (null to clear)"} | ||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||
| "additionalProperties": false | ||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **Operational Semantics**: | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| 1. **Partial Updates**: Only fields explicitly provided are modified; omitted fields are unchanged. | ||||||||||||||||||||||||||
| 2. **Body Operation Modes**: `replace` overwrites the entire body; `append`/`prepend` add content with separator; `replace-island` updates a run-specific section. | ||||||||||||||||||||||||||
| 3. **Label Validation**: Provided labels must exist in the repository; non-existent labels cause failure. | ||||||||||||||||||||||||||
| 4. **Assignee Resolution**: Assignees must have repository access; invalid usernames cause failure. | ||||||||||||||||||||||||||
| 5. **Cross-Repository**: When `target-repo` is configured, operates on that repository (must be in `allowed-repos`). | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **Configuration Parameters**: | ||||||||||||||||||||||||||
| - `max`: Operation limit (default: 1) | ||||||||||||||||||||||||||
| - `target-repo`: Cross-repository target | ||||||||||||||||||||||||||
| - `allowed-repos`: Cross-repo allowlist | ||||||||||||||||||||||||||
| - `staged`: Staged mode override | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **Security Requirements**: | ||||||||||||||||||||||||||
| - Title and body MUST undergo full content sanitization before modification | ||||||||||||||||||||||||||
| - Label values MUST be validated against repository labels before application | ||||||||||||||||||||||||||
| - Cross-repository targets MUST be validated against the `allowed-repos` allowlist | ||||||||||||||||||||||||||
| - Issue number MUST be validated as a positive integer belonging to the target repository | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **Required Permissions**: | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| *GitHub Actions Token*: | ||||||||||||||||||||||||||
|
|
@@ -2081,6 +2137,48 @@ This section provides complete definitions for all remaining safe output types. | |||||||||||||||||||||||||
| **Cross-Repository Support**: Yes | ||||||||||||||||||||||||||
| **Mandatory**: No | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **MCP Tool Schema**: | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ```json | ||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||
| "name": "close_issue", | ||||||||||||||||||||||||||
| "description": "Close a GitHub issue with a closing comment explaining the resolution or reason for closing.", | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
| "description": "Close a GitHub issue with a closing comment explaining the resolution or reason for closing.", | |
| "description": "Close a GitHub issue by posting a final closing comment that explains the resolution or reason for closing. Use this when the issue's work is complete and it should be closed, rather than `update_issue` which is for modifying still-open issues. This operation is idempotent: if the issue is already closed, it will only add the closing comment.", |
Copilot
AI
Feb 21, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The property descriptions for parent_issue_number and sub_issue_number are simplified. The actual schema (lines 846-859) includes helpful examples showing the numeric ID format from GitHub URLs. Consider matching those detailed descriptions for better usability.
This issue also appears in the following locations of the same file:
- line 2207
- line 2241
- line 2234
- line 2235
- line 2230
| "description": "The parent issue number to link the sub-issue to" | |
| }, | |
| "sub_issue_number": { | |
| "type": ["number", "string"], | |
| "description": "The issue number to link as a sub-issue of the parent" | |
| "description": "The numeric ID of the parent issue, as it appears in the GitHub URL (for example, for https://github.com/OWNER/REPO/issues/123 use 123)." | |
| }, | |
| "sub_issue_number": { | |
| "type": ["number", "string"], | |
| "description": "The numeric ID of the issue to link as a sub-issue, as it appears in the GitHub URL (for example, for https://github.com/OWNER/REPO/issues/456 use 456)." |
Copilot
AI
Feb 21, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The MCP Tool Schema for create_discussion has a simplified description. The actual schema (line 62) provides important guidance about when to use this tool versus create_issue, explaining use cases and benefits. Consider using the exact description from safe_outputs_tools.json for consistency and completeness.
This issue also appears on line 2278 of the same file.
| "description": "Create a GitHub discussion for announcements, Q&A, reports, status updates, or community conversations.", | |
| "inputSchema": { | |
| "type": "object", | |
| "required": ["title", "body"], | |
| "properties": { | |
| "title": {"type": "string", "description": "Discussion title"}, | |
| "description": "Create a GitHub discussion instead of an issue when you want an open-ended, collaborative conversation (for example, announcements, Q&A, RFCs, status updates, or community feedback) that is not directly tracked as actionable work. Use `create_issue` for concrete tasks, bugs, and work items that need to be tracked and closed.", | |
| "inputSchema": { | |
| "type": "object", | |
| "required": ["title", "body"], | |
| "properties": { | |
| "title": {"type": "string", "description": "Clear, human-readable discussion title that summarizes the topic or question (not an issue or bug summary)."}, |
Copilot
AI
Feb 21, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The MCP Tool Schema for update_discussion has a simplified description. The actual schema (line 88) provides important context about partial updates. Consider using the exact description from safe_outputs_tools.json for consistency.
This issue also appears on line 2346 of the same file.
| "description": "Update an existing GitHub discussion's title or body. Only the fields you specify will be updated.", | |
| "inputSchema": { | |
| "type": "object", | |
| "properties": { | |
| "title": {"type": "string", "description": "New discussion title"}, | |
| "body": {"type": "string", "description": "New discussion body in Markdown"}, | |
| "description": "Partially update an existing GitHub discussion's title or body. Only fields explicitly provided in the input will be modified; any omitted fields will retain their existing values.", | |
| "inputSchema": { | |
| "type": "object", | |
| "properties": { | |
| "title": {"type": "string", "description": "Optional. New discussion title. If omitted, the existing title will be preserved."}, | |
| "body": {"type": "string", "description": "Optional. New discussion body in Markdown. If omitted, the existing body will be preserved."}, |
Copilot
AI
Feb 21, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The MCP Tool Schema for close_discussion has a simplified description. The actual schema (line 113) provides important guidance about when to use this tool and explains idempotent behavior. Consider using the exact description from safe_outputs_tools.json for consistency and completeness.
This issue also appears on line 2407 of the same file.
| "description": "Close a GitHub discussion with a resolution comment and optional reason.", | |
| "inputSchema": { | |
| "type": "object", | |
| "required": ["body"], | |
| "properties": { | |
| "body": {"type": "string", "description": "Closing comment explaining why the discussion is being closed"}, | |
| "description": "Close a GitHub discussion by posting a final resolution comment and optional reason. Use this tool only when the discussion outcome is clear and no further assistant actions are needed. This operation is idempotent: if the discussion is already closed in the same state, calling this tool again has no additional effect.", | |
| "inputSchema": { | |
| "type": "object", | |
| "required": ["body"], | |
| "properties": { | |
| "body": {"type": "string", "description": "Final closing comment that clearly explains the resolution, summarizes the outcome, and states why the discussion is being closed"}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The property descriptions in the
update_issueschema are overly simplified compared to the actual tool schema. For example, theissue_numberdescription should clarify that it's required when the workflow target is '*' (any issue) and should include an example format (e.g., "789 in github.com/owner/repo/issues/789"). Theoperationdescription should also explain what each mode does rather than just saying "Body update mode". Consider matching the detailed descriptions fromsafe_outputs_tools.jsonlines 621-675.This issue also appears on line 2074 of the same file.