Bug Report to Issue
ivy.agent.bug-report-to-issue · v1.0.0
ivyx
Takes an in-app bug report, has a model write a GitHub issue from it, opens the issue and records the issue's address back on the report through your API.
Steps
In the order the agent's file lists them, each with where its inputs come from and the values the file fixes. A branch or a loop is a step too.
- 01Model turnWrite the issue
Write a GitHub issue from this bug report: a short title, and a Markdown body with what happened, how to reproduce it as far as the report says, and the app version. Do not invent details.
- takes
contextfrom the agent's input,payload- returns
issue_title
- 02Ivy NodeOpen the issueivy.node.http-request
Sends one HTTP request to a URL and returns the status, headers and body, parsed as JSON when the response is JSON.
- takes
urlfrom the agent's input,issues_urljson.titlefrom step 1,output.titlejson.bodyfrom step 1,output.body- set
methodPOST- secret
tokenthe stored secret github-token- returns
issue_number,issue_url
- 03Ivy NodeRecord the link on the reportivy.node.http-request
Sends one HTTP request to a URL and returns the status, headers and body, parsed as JSON when the response is JSON.
- takes
urlfrom the agent's input,reports_urljson.report_idfrom the agent's input,payload.report_idjson.issue_urlfrom step 2,json.html_url- set
methodPATCH- secret
tokenthe stored secret saas-api-key- returns
saas_status
Nodes it brings
Adding this agent in IVYX Studio adds these nodes with it. A node your workspace already has is kept as it is, even at another version.
What it touches
Collected from what each of its nodes declares, plus the model call when a step is a model turn. A declaration is the author's statement, and it is what policy rules select on.
What it needs
- A stored secret named
github-token. The agent's file carries the name, never the value. - A stored secret named
saas-api-key. The agent's file carries the name, never the value.
Inputs
| Field | Type | Description |
|---|---|---|
| payloadrequired | object | The event your service posted: report_id, title, description, app_version and the user who reported it. |
| issues_urlrequired | string | The repository's issues endpoint, such as https://api.github.com/repos/<owner>/<repo>/issues. The stand-in's address is used in the cases. |
| reports_urlrequired | string | Your API's endpoint for bug reports; a PATCH with report_id and issue_url records the link. The stand-in's address is used in the cases. |
Outputs
| Field | Type | Description |
|---|---|---|
| issue_number | integer | The number GitHub gave the issue. |
| issue_url | string | The issue's page. |
| issue_title | string | The title the model wrote. |
| saas_status | integer | Your API's HTTP status for the record. |
Tests
2 of 2 test cases passed on Oct 7, 2026, in the publisher's own environment, before this version was published. The registry keeps that record; it does not run the cases again.
Requires: python:3.9, a model core, a GitHub token stored as the secret github-token, your own API's key stored as the secret saas-api-key, for the cases, the stand-in API on 127.0.0.1:18910 (api-standin.py), which the secrets crm-1, gh-1, saas-1 and the stand-in's /slack/hook address satisfy
- crash-on-export
A crash report becomes an issue whose address is written back to the report.
- given
payload{"report_id":"R-1042","title":"App crashes on export","description":"Export to CSV crashes the app after the progress...issues_urlhttp://127.0.0.1:18910/repos/acme/app/issuesreports_urlhttp://127.0.0.1:18910/accounts- expects
issue_numberis greater than 0issue_urlmatches github\.com/acme/app/issues/\d+issue_titlematches \w{3}saas_statusequals 200
- wrong-total
A second report is a second issue, not a remembered one.
- given
payload{"report_id":"R-1043","title":"Invoice total off by tax","description":"The invoice PDF shows the total before VAT wh...issues_urlhttp://127.0.0.1:18910/repos/acme/app/issuesreports_urlhttp://127.0.0.1:18910/accounts- expects
issue_numberis greater than 0issue_titlematches [Ii]nvoice|[Tt]otal|VAT|vat|[Tt]axsaas_statusequals 200