From 0e93219a80fb604ab579af2056aec8827044fe68 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 12:09:49 +0000 Subject: [PATCH 1/4] Initial plan From 094b48ca5e1c3f6f0ba5413a9b0834c058ed7890 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 12:16:14 +0000 Subject: [PATCH 2/4] chore: initial plan for arxiv researcher token optimization Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/skills/agentic-workflows/SKILL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/skills/agentic-workflows/SKILL.md b/.github/skills/agentic-workflows/SKILL.md index 6fb19019416..141445630d5 100644 --- a/.github/skills/agentic-workflows/SKILL.md +++ b/.github/skills/agentic-workflows/SKILL.md @@ -71,6 +71,7 @@ Load these files from `github/gh-aw` (they are not available locally). - `.github/aw/test-coverage.md` - `.github/aw/test-expression.md` - `.github/aw/token-optimization-caching-budgets.md` +- `.github/aw/token-optimization-observability.md` - `.github/aw/token-optimization.md` - `.github/aw/triggers.md` - `.github/aw/update-agentic-workflow.md` From 82aaf13e88fcdac918c6b1ae244a8c61833eb958 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 12:23:00 +0000 Subject: [PATCH 3/4] fix(arxiv-researcher): optimize token usage and increase max-ai-credits limit Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/skills/agentic-workflows/SKILL.md | 1 - .../workflows/daily-arxiv-researcher.lock.yml | 8 +- .github/workflows/daily-arxiv-researcher.md | 91 ++++++++++--------- 3 files changed, 53 insertions(+), 47 deletions(-) diff --git a/.github/skills/agentic-workflows/SKILL.md b/.github/skills/agentic-workflows/SKILL.md index 141445630d5..6fb19019416 100644 --- a/.github/skills/agentic-workflows/SKILL.md +++ b/.github/skills/agentic-workflows/SKILL.md @@ -71,7 +71,6 @@ Load these files from `github/gh-aw` (they are not available locally). - `.github/aw/test-coverage.md` - `.github/aw/test-expression.md` - `.github/aw/token-optimization-caching-budgets.md` -- `.github/aw/token-optimization-observability.md` - `.github/aw/token-optimization.md` - `.github/aw/triggers.md` - `.github/aw/update-agentic-workflow.md` diff --git a/.github/workflows/daily-arxiv-researcher.lock.yml b/.github/workflows/daily-arxiv-researcher.lock.yml index 87672154e21..83e5aad5059 100644 --- a/.github/workflows/daily-arxiv-researcher.lock.yml +++ b/.github/workflows/daily-arxiv-researcher.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"e728d34a9b6ec9a5e99622436ab822ee85fb0a7889dd028659495b854d0303ec","body_hash":"493273f217aa12541ba40ba126ebfe934d2b5c2d66eb50876f3b2fc2e61ad91e","strict":true,"agent_id":"claude","engine_versions":{"claude":"2.1.220"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"368041f958b1c4852a46b2ab745d61898bb01711f681c65fc20795769b0647bd","body_hash":"e76340573dfb7be7903542b1d9dfb14f0aa7de072d4ef3647340094d89a8d0d5","strict":true,"agent_id":"claude","engine_versions":{"claude":"2.1.220"}} # gh-aw-manifest: {"version":1,"secrets":["ANTHROPIC_API_KEY","COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.43","digest":"sha256:04e2d1987a565000a8f114b89d806ae7a3864dd4f944be65275b28c93d8690e6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.43@sha256:04e2d1987a565000a8f114b89d806ae7a3864dd4f944be65275b28c93d8690e6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.43","digest":"sha256:d85f57975af5ea23af4996e41ed73fbc8f5b4a47402472bfe82e508f352cb0c1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.43@sha256:d85f57975af5ea23af4996e41ed73fbc8f5b4a47402472bfe82e508f352cb0c1"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.43","digest":"sha256:26be5e0b8c8f4c41c8a59126b29bb5d80b07253597472ded2a16bdd75abcbf9d","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.43@sha256:26be5e0b8c8f4c41c8a59126b29bb5d80b07253597472ded2a16bdd75abcbf9d"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.7","digest":"sha256:7545220a9aca134b71e51193ee0eaf4c50756ebf8fbd25a63ae7556e62815c00","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.7@sha256:7545220a9aca134b71e51193ee0eaf4c50756ebf8fbd25a63ae7556e62815c00"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:0d9f1fb5fd6610c0ac1f5194a38e45a8a1e81f8a390d5142d8e4e6f26a4b3196","pinned_image":"ghcr.io/github/gh-aw-node@sha256:0d9f1fb5fd6610c0ac1f5194a38e45a8a1e81f8a390d5142d8e4e6f26a4b3196"},{"image":"ghcr.io/github/github-mcp-server:v1.8.0","digest":"sha256:d5a18c04b92714c309eb46a2305087e91a4dbd80420f6e462656699f95093520","pinned_image":"ghcr.io/github/github-mcp-server:v1.8.0@sha256:d5a18c04b92714c309eb46a2305087e91a4dbd80420f6e462656699f95093520"}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -515,7 +515,7 @@ jobs: - name: Fetch and parse arXiv papers uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: - script: "const fs = require('fs');\nconst https = require('https');\n\nconst BASE_DIR = '/tmp/gh-aw/agent/arxiv';\nconst PAPERS_JSON = `${BASE_DIR}/papers.json`;\nconst NEW_PAPERS_JSON = `${BASE_DIR}/new-papers.json`;\nconst SEEN_IDS_JSON = '/tmp/gh-aw/cache-memory/seen-paper-ids.json';\n\nfs.mkdirSync(BASE_DIR, { recursive: true });\n\nconst ARXIV_URL = 'https://export.arxiv.org/api/query?search_query=(cat:cs.AI+OR+cat:cs.SE+OR+cat:cs.LG)+AND+(agentic+OR+%22multi-agent%22+OR+%22llm+agent%22+OR+%22workflow+automation%22+OR+%22code+generation%22+OR+%22ai+agent%22)&max_results=40&sortBy=submittedDate&sortOrder=descending';\n\nlet xml = '';\ntry {\n xml = await new Promise((resolve, reject) => {\n const req = https.get(ARXIV_URL, { timeout: 30000 }, res => {\n const chunks = [];\n res.on('data', c => chunks.push(c));\n res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n req.on('error', reject);\n req.on('timeout', () => { req.destroy(); reject(new Error('request timed out')); });\n });\n} catch (e) {\n core.warning(`arXiv fetch failed: ${e.message}`);\n}\n\nconst decodeEntities = s => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"');\nconst getText = (tag, s) => {\n const m = s.match(new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)`));\n return m ? decodeEntities(m[1].replace(/\\s+/g, ' ').trim()) : '';\n};\nconst getAllText = (tag, s) => {\n const re = new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)`, 'g');\n const out = []; let m;\n while ((m = re.exec(s)) !== null) out.push(decodeEntities(m[1].replace(/\\s+/g, ' ').trim()));\n return out;\n};\nconst getAllAttr = (tag, attr, s) => {\n const re = new RegExp(`<${tag}[^>]*${attr}=\"([^\"]*)\"`, 'g');\n const out = []; let m;\n while ((m = re.exec(s)) !== null) out.push(m[1]);\n return out;\n};\n\nconst papers = [];\nconst entryRe = /([\\s\\S]*?)<\\/entry>/g;\nlet em;\nwhile ((em = entryRe.exec(xml)) !== null) {\n const entry = em[1];\n const idUrl = getText('id', entry);\n const arxivId = idUrl.replace(/.*abs\\//, '').trim();\n if (!arxivId) continue;\n papers.push({\n id: arxivId,\n title: getText('title', entry),\n abstract: getText('summary', entry).slice(0, 1200),\n authors: getAllText('name', entry).slice(0, 3),\n published: getText('published', entry).slice(0, 10),\n categories: getAllAttr('category', 'term', entry).slice(0, 3),\n url: `https://arxiv.org/abs/${arxivId}`\n });\n}\n\nconst fetchedAt = new Date().toISOString().slice(0, 10);\nfs.writeFileSync(PAPERS_JSON, JSON.stringify({ fetched_at: fetchedAt, count: papers.length, papers }, null, 2));\n\nconst seenIds = new Set();\nif (fs.existsSync(SEEN_IDS_JSON)) {\n try {\n const d = JSON.parse(fs.readFileSync(SEEN_IDS_JSON, 'utf8'));\n for (const id of (d.ids || [])) seenIds.add(id);\n } catch (_) {}\n}\n\nconst newPapers = papers.filter(p => !seenIds.has(p.id));\nfs.writeFileSync(NEW_PAPERS_JSON, JSON.stringify({\n total_fetched: papers.length,\n already_seen: papers.length - newPapers.length,\n new_count: newPapers.length,\n fetched_at: fetchedAt,\n papers: newPapers\n}, null, 2));\n\ncore.info(`Parsed ${papers.length} papers, ${newPapers.length} new`);" + script: "const fs = require('fs');\nconst https = require('https');\n\nconst BASE_DIR = '/tmp/gh-aw/agent/arxiv';\nconst PAPERS_JSON = `${BASE_DIR}/papers.json`;\nconst NEW_PAPERS_JSON = `${BASE_DIR}/new-papers.json`;\nconst SEEN_IDS_JSON = '/tmp/gh-aw/cache-memory/seen-paper-ids.json';\n\nfs.mkdirSync(BASE_DIR, { recursive: true });\n\nconst ARXIV_URL = 'https://export.arxiv.org/api/query?search_query=(cat:cs.AI+OR+cat:cs.SE+OR+cat:cs.LG)+AND+(agentic+OR+%22multi-agent%22+OR+%22llm+agent%22+OR+%22workflow+automation%22+OR+%22code+generation%22+OR+%22ai+agent%22)&max_results=25&sortBy=submittedDate&sortOrder=descending';\n\nlet xml = '';\ntry {\n xml = await new Promise((resolve, reject) => {\n const req = https.get(ARXIV_URL, { timeout: 30000 }, res => {\n const chunks = [];\n res.on('data', c => chunks.push(c));\n res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n req.on('error', reject);\n req.on('timeout', () => { req.destroy(); reject(new Error('request timed out')); });\n });\n} catch (e) {\n core.warning(`arXiv fetch failed: ${e.message}`);\n}\n\nconst decodeEntities = s => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"');\nconst getText = (tag, s) => {\n const m = s.match(new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)`));\n return m ? decodeEntities(m[1].replace(/\\s+/g, ' ').trim()) : '';\n};\nconst getAllText = (tag, s) => {\n const re = new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)`, 'g');\n const out = []; let m;\n while ((m = re.exec(s)) !== null) out.push(decodeEntities(m[1].replace(/\\s+/g, ' ').trim()));\n return out;\n};\nconst getAllAttr = (tag, attr, s) => {\n const re = new RegExp(`<${tag}[^>]*${attr}=\"([^\"]*)\"`, 'g');\n const out = []; let m;\n while ((m = re.exec(s)) !== null) out.push(m[1]);\n return out;\n};\n\nconst papers = [];\nconst entryRe = /([\\s\\S]*?)<\\/entry>/g;\nlet em;\nwhile ((em = entryRe.exec(xml)) !== null) {\n const entry = em[1];\n const idUrl = getText('id', entry);\n const arxivId = idUrl.replace(/.*abs\\//, '').trim();\n if (!arxivId) continue;\n papers.push({\n id: arxivId,\n title: getText('title', entry),\n abstract: getText('summary', entry).slice(0, 800),\n authors: getAllText('name', entry).slice(0, 3),\n published: getText('published', entry).slice(0, 10),\n categories: getAllAttr('category', 'term', entry).slice(0, 3),\n url: `https://arxiv.org/abs/${arxivId}`\n });\n}\n\nconst fetchedAt = new Date().toISOString().slice(0, 10);\nfs.writeFileSync(PAPERS_JSON, JSON.stringify({ fetched_at: fetchedAt, count: papers.length, papers }, null, 2));\n\nconst seenIds = new Set();\nif (fs.existsSync(SEEN_IDS_JSON)) {\n try {\n const d = JSON.parse(fs.readFileSync(SEEN_IDS_JSON, 'utf8'));\n for (const id of (d.ids || [])) seenIds.add(id);\n } catch (_) {}\n}\n\nconst newPapers = papers.filter(p => !seenIds.has(p.id));\nfs.writeFileSync(NEW_PAPERS_JSON, JSON.stringify({\n total_fetched: papers.length,\n already_seen: papers.length - newPapers.length,\n new_count: newPapers.length,\n fetched_at: fetchedAt,\n papers: newPapers\n}, null, 2));\n\ncore.info(`Parsed ${papers.length} papers, ${newPapers.length} new`);" - name: Configure Git credentials env: @@ -919,7 +919,7 @@ jobs: touch /tmp/gh-aw/agent-step-summary.md (umask 177 && touch /tmp/gh-aw/agent-stdio.log) # shellcheck disable=SC2016 - printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.27.43/awf-config.schema.json","network":{"allowDomains":["*.githubusercontent.com","anthropic.com","api.anthropic.com","api.github.com","api.snapcraft.io","archive.ubuntu.com","azure.archive.ubuntu.com","cdn.playwright.dev","codeload.github.com","crl.geotrust.com","crl.globalsign.com","crl.identrust.com","crl.sectigo.com","crl.thawte.com","crl.usertrust.com","crl.verisign.com","crl3.digicert.com","crl4.digicert.com","crls.ssl.com","files.pythonhosted.org","ghcr.io","github-cloud.githubusercontent.com","github-cloud.s3.amazonaws.com","github.com","host.docker.internal","json-schema.org","json.schemastore.org","keyserver.ubuntu.com","lfs.github.com","objects.githubusercontent.com","ocsp.digicert.com","ocsp.geotrust.com","ocsp.globalsign.com","ocsp.identrust.com","ocsp.sectigo.com","ocsp.ssl.com","ocsp.thawte.com","ocsp.usertrust.com","ocsp.verisign.com","packagecloud.io","packages.cloud.google.com","packages.microsoft.com","playwright.download.prss.microsoft.com","ppa.launchpad.net","pypi.org","raw.githubusercontent.com","registry.npmjs.org","s.symcb.com","s.symcd.com","security.ubuntu.com","sentry.io","statsig.anthropic.com","ts-crl.ws.symantec.com","ts-ocsp.ws.symantec.com","www.googleapis.com"],"isolation":true,"topologyAttach":["awmg-mcpg"]},"apiProxy":{"enabled":true,"enableTokenSteering":true,"maxRuns":500,"maxCacheMisses":5,"maxAiCredits":250,"models":{"agent":["sonnet-6x","gpt-5.4","gpt-5.5","gpt-5.6","gpt-5.3","gemini-pro","any"],"antigravity":["copilot/antigravity*","google/antigravity*","gemini/antigravity*"],"any":["copilot/*","anthropic/*","openai/*","google/*","gemini/*"],"auto":["copilot/auto","large"],"claude":["agent"],"codex":["agent"],"coding":["copilot/gpt-5*codex*","openai/gpt-5*codex*","gpt-5-codex","kimi"],"computer-use":["copilot/*computer-use*","google/*computer-use*","gemini/*computer-use*","openai/*computer-use*"],"copilot":["agent"],"deep-research":["copilot/deep-research*","copilot/o3-deep-research*","copilot/o4-mini-deep-research*","google/deep-research*","gemini/deep-research*","openai/o3-deep-research*","openai/o4-mini-deep-research*"],"detection":["small"],"evals":["small"],"fable":["copilot/*fable*","anthropic/*fable*"],"gemini":["agent"],"gemini-3-flash":["copilot/gemini-3*flash*","google/gemini-3*flash*","gemini/gemini-3*flash*"],"gemini-3-pro":["copilot/gemini-3*pro*","google/gemini-3*pro*","google/nano-banana*","gemini/gemini-3*pro*"],"gemini-3.1-flash":["copilot/gemini-3.1*flash*","google/gemini-3.1*flash*","gemini/gemini-3.1*flash*"],"gemini-3.1-pro":["copilot/gemini-3.1*pro*","google/gemini-3.1*pro*","gemini/gemini-3.1*pro*"],"gemini-3.5-flash":["copilot/gemini-3.5*flash*","google/gemini-3.5*flash*","gemini/gemini-3.5*flash*"],"gemini-3.6-flash":["copilot/gemini-3.6*flash*","google/gemini-3.6*flash*","gemini/gemini-3.6*flash*"],"gemini-flash":["copilot/gemini-*flash*","google/gemini-*flash*","gemini/gemini-*flash*"],"gemini-flash-lite":["copilot/gemini-*flash*lite*","google/gemini-*flash*lite*","gemini/gemini-*flash*lite*"],"gemini-omni":["copilot/gemini-omni*","google/gemini-omni*","gemini/gemini-omni*"],"gemini-pro":["copilot/gemini-*pro*","google/gemini-*pro*","gemini/gemini-*pro*"],"gemma":["copilot/gemma*","google/gemma*","gemini/gemma*"],"gpt-5":["copilot/gpt-5*","openai/gpt-5*"],"gpt-5-codex":["copilot/gpt-5*codex*","openai/gpt-5*codex*"],"gpt-5-mini":["copilot/gpt-5*mini*","openai/gpt-5*mini*"],"gpt-5-nano":["copilot/gpt-5*nano*","openai/gpt-5*nano*"],"gpt-5-pro":["copilot/gpt-5*pro*","openai/gpt-5*pro*"],"gpt-5.1":["copilot/gpt-5.1*","openai/gpt-5.1*"],"gpt-5.2":["copilot/gpt-5.2*","openai/gpt-5.2*"],"gpt-5.3":["copilot/gpt-5.3*","openai/gpt-5.3*"],"gpt-5.4":["copilot/gpt-5.4*","openai/gpt-5.4*"],"gpt-5.5":["copilot/gpt-5.5*","openai/gpt-5.5*"],"gpt-5.6":["copilot/gpt-5.6*","openai/gpt-5.6*"],"grok":["copilot/*grok*","openai/*grok*"],"haiku":["copilot/*haiku*","anthropic/*haiku*"],"image-generation":["copilot/gpt-image*","openai/gpt-image*","openai/chatgpt-image*","copilot/gemini-*image*","google/gemini-*image*","gemini/gemini-*image*","google/imagen*"],"kimi":["copilot/kimi*","openai/kimi*"],"kiwi":["copilot/kiwi*","openai/kiwi*"],"large":["sonnet","gpt-5-pro","gpt-5","gemini-pro"],"lyria":["google/lyria*","gemini/lyria*","copilot/lyria*"],"mai-code":["copilot/MAI-Code*","copilot/mai-code*","openai/MAI-Code*"],"mai-code-1-flash-picker":["copilot/MAI-Code-1-Flash-picker*","copilot/mai-code-1-flash-picker*","openai/MAI-Code-1-Flash-picker*"],"mini":["haiku","gpt-5-mini","gpt-5-nano","gemini-flash-lite"],"nano-banana":["copilot/nano-banana*","google/nano-banana*","gemini/nano-banana*"],"opus":["copilot/*opus*","anthropic/*opus*"],"opusplan":["opus?effort=high"],"raptor-mini":["copilot/raptor*","openai/raptor*"],"reasoning":["copilot/o1*","copilot/o3*","copilot/o4*","openai/o1*","openai/o3*","openai/o4*"],"robotics":["copilot/*robotics*","google/*robotics*","gemini/*robotics*"],"small":["mini"],"small-agent":["haiku","gpt-5-mini","gemini-flash"],"sonnet":["copilot/*sonnet*","anthropic/*sonnet*"],"sonnet-6x":["copilot/*sonnet-4.5*","copilot/*sonnet-4.6*","copilot/*sonnet-5*","copilot/*sonnet-4-5-*","anthropic/*sonnet-4-5-*","copilot/*sonnet-4-6*","anthropic/*sonnet-4-6*","anthropic/*sonnet-5*"],"summarization":["haiku","gpt-5-mini","gemini-flash-lite","mini"],"veo":["google/veo*","gemini/veo*"],"vision":["copilot/gemini-*image*","google/gemini-*image*","gemini/gemini-*image*","copilot/gemini-*flash*","google/gemini-*flash*","gemini/gemini-*flash*"]}},"container":{"imageTag":"0.27.43,squid=sha256:26be5e0b8c8f4c41c8a59126b29bb5d80b07253597472ded2a16bdd75abcbf9d,agent=sha256:04e2d1987a565000a8f114b89d806ae7a3864dd4f944be65275b28c93d8690e6,api-proxy=sha256:d85f57975af5ea23af4996e41ed73fbc8f5b4a47402472bfe82e508f352cb0c1,cli-proxy=sha256:65c45ea2967984d0024f3df61bc71335658a77ede96c8d9665da7a5f33a795ab"},"logging":{"proxyLogsDir":"/tmp/gh-aw/sandbox/firewall/logs","auditDir":"/tmp/gh-aw/sandbox/firewall/audit"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" + printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.27.43/awf-config.schema.json","network":{"allowDomains":["*.githubusercontent.com","anthropic.com","api.anthropic.com","api.github.com","api.snapcraft.io","archive.ubuntu.com","azure.archive.ubuntu.com","cdn.playwright.dev","codeload.github.com","crl.geotrust.com","crl.globalsign.com","crl.identrust.com","crl.sectigo.com","crl.thawte.com","crl.usertrust.com","crl.verisign.com","crl3.digicert.com","crl4.digicert.com","crls.ssl.com","files.pythonhosted.org","ghcr.io","github-cloud.githubusercontent.com","github-cloud.s3.amazonaws.com","github.com","host.docker.internal","json-schema.org","json.schemastore.org","keyserver.ubuntu.com","lfs.github.com","objects.githubusercontent.com","ocsp.digicert.com","ocsp.geotrust.com","ocsp.globalsign.com","ocsp.identrust.com","ocsp.sectigo.com","ocsp.ssl.com","ocsp.thawte.com","ocsp.usertrust.com","ocsp.verisign.com","packagecloud.io","packages.cloud.google.com","packages.microsoft.com","playwright.download.prss.microsoft.com","ppa.launchpad.net","pypi.org","raw.githubusercontent.com","registry.npmjs.org","s.symcb.com","s.symcd.com","security.ubuntu.com","sentry.io","statsig.anthropic.com","ts-crl.ws.symantec.com","ts-ocsp.ws.symantec.com","www.googleapis.com"],"isolation":true,"topologyAttach":["awmg-mcpg"]},"apiProxy":{"enabled":true,"enableTokenSteering":true,"maxRuns":500,"maxCacheMisses":5,"maxAiCredits":300,"models":{"agent":["sonnet-6x","gpt-5.4","gpt-5.5","gpt-5.6","gpt-5.3","gemini-pro","any"],"antigravity":["copilot/antigravity*","google/antigravity*","gemini/antigravity*"],"any":["copilot/*","anthropic/*","openai/*","google/*","gemini/*"],"auto":["copilot/auto","large"],"claude":["agent"],"codex":["agent"],"coding":["copilot/gpt-5*codex*","openai/gpt-5*codex*","gpt-5-codex","kimi"],"computer-use":["copilot/*computer-use*","google/*computer-use*","gemini/*computer-use*","openai/*computer-use*"],"copilot":["agent"],"deep-research":["copilot/deep-research*","copilot/o3-deep-research*","copilot/o4-mini-deep-research*","google/deep-research*","gemini/deep-research*","openai/o3-deep-research*","openai/o4-mini-deep-research*"],"detection":["small"],"evals":["small"],"fable":["copilot/*fable*","anthropic/*fable*"],"gemini":["agent"],"gemini-3-flash":["copilot/gemini-3*flash*","google/gemini-3*flash*","gemini/gemini-3*flash*"],"gemini-3-pro":["copilot/gemini-3*pro*","google/gemini-3*pro*","google/nano-banana*","gemini/gemini-3*pro*"],"gemini-3.1-flash":["copilot/gemini-3.1*flash*","google/gemini-3.1*flash*","gemini/gemini-3.1*flash*"],"gemini-3.1-pro":["copilot/gemini-3.1*pro*","google/gemini-3.1*pro*","gemini/gemini-3.1*pro*"],"gemini-3.5-flash":["copilot/gemini-3.5*flash*","google/gemini-3.5*flash*","gemini/gemini-3.5*flash*"],"gemini-3.6-flash":["copilot/gemini-3.6*flash*","google/gemini-3.6*flash*","gemini/gemini-3.6*flash*"],"gemini-flash":["copilot/gemini-*flash*","google/gemini-*flash*","gemini/gemini-*flash*"],"gemini-flash-lite":["copilot/gemini-*flash*lite*","google/gemini-*flash*lite*","gemini/gemini-*flash*lite*"],"gemini-omni":["copilot/gemini-omni*","google/gemini-omni*","gemini/gemini-omni*"],"gemini-pro":["copilot/gemini-*pro*","google/gemini-*pro*","gemini/gemini-*pro*"],"gemma":["copilot/gemma*","google/gemma*","gemini/gemma*"],"gpt-5":["copilot/gpt-5*","openai/gpt-5*"],"gpt-5-codex":["copilot/gpt-5*codex*","openai/gpt-5*codex*"],"gpt-5-mini":["copilot/gpt-5*mini*","openai/gpt-5*mini*"],"gpt-5-nano":["copilot/gpt-5*nano*","openai/gpt-5*nano*"],"gpt-5-pro":["copilot/gpt-5*pro*","openai/gpt-5*pro*"],"gpt-5.1":["copilot/gpt-5.1*","openai/gpt-5.1*"],"gpt-5.2":["copilot/gpt-5.2*","openai/gpt-5.2*"],"gpt-5.3":["copilot/gpt-5.3*","openai/gpt-5.3*"],"gpt-5.4":["copilot/gpt-5.4*","openai/gpt-5.4*"],"gpt-5.5":["copilot/gpt-5.5*","openai/gpt-5.5*"],"gpt-5.6":["copilot/gpt-5.6*","openai/gpt-5.6*"],"grok":["copilot/*grok*","openai/*grok*"],"haiku":["copilot/*haiku*","anthropic/*haiku*"],"image-generation":["copilot/gpt-image*","openai/gpt-image*","openai/chatgpt-image*","copilot/gemini-*image*","google/gemini-*image*","gemini/gemini-*image*","google/imagen*"],"kimi":["copilot/kimi*","openai/kimi*"],"kiwi":["copilot/kiwi*","openai/kiwi*"],"large":["sonnet","gpt-5-pro","gpt-5","gemini-pro"],"lyria":["google/lyria*","gemini/lyria*","copilot/lyria*"],"mai-code":["copilot/MAI-Code*","copilot/mai-code*","openai/MAI-Code*"],"mai-code-1-flash-picker":["copilot/MAI-Code-1-Flash-picker*","copilot/mai-code-1-flash-picker*","openai/MAI-Code-1-Flash-picker*"],"mini":["haiku","gpt-5-mini","gpt-5-nano","gemini-flash-lite"],"nano-banana":["copilot/nano-banana*","google/nano-banana*","gemini/nano-banana*"],"opus":["copilot/*opus*","anthropic/*opus*"],"opusplan":["opus?effort=high"],"raptor-mini":["copilot/raptor*","openai/raptor*"],"reasoning":["copilot/o1*","copilot/o3*","copilot/o4*","openai/o1*","openai/o3*","openai/o4*"],"robotics":["copilot/*robotics*","google/*robotics*","gemini/*robotics*"],"small":["mini"],"small-agent":["haiku","gpt-5-mini","gemini-flash"],"sonnet":["copilot/*sonnet*","anthropic/*sonnet*"],"sonnet-6x":["copilot/*sonnet-4.5*","copilot/*sonnet-4.6*","copilot/*sonnet-5*","copilot/*sonnet-4-5-*","anthropic/*sonnet-4-5-*","copilot/*sonnet-4-6*","anthropic/*sonnet-4-6*","anthropic/*sonnet-5*"],"summarization":["haiku","gpt-5-mini","gemini-flash-lite","mini"],"veo":["google/veo*","gemini/veo*"],"vision":["copilot/gemini-*image*","google/gemini-*image*","gemini/gemini-*image*","copilot/gemini-*flash*","google/gemini-*flash*","gemini/gemini-*flash*"]}},"container":{"imageTag":"0.27.43,squid=sha256:26be5e0b8c8f4c41c8a59126b29bb5d80b07253597472ded2a16bdd75abcbf9d,agent=sha256:04e2d1987a565000a8f114b89d806ae7a3864dd4f944be65275b28c93d8690e6,api-proxy=sha256:d85f57975af5ea23af4996e41ed73fbc8f5b4a47402472bfe82e508f352cb0c1,cli-proxy=sha256:65c45ea2967984d0024f3df61bc71335658a77ede96c8d9665da7a5f33a795ab"},"logging":{"proxyLogsDir":"/tmp/gh-aw/sandbox/firewall/logs","auditDir":"/tmp/gh-aw/sandbox/firewall/audit"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json" GH_AW_DOCKER_HOST="" @@ -1374,7 +1374,7 @@ jobs: GH_AW_UNKNOWN_MODEL_AI_CREDITS: ${{ needs.agent.outputs.unknown_model_ai_credits || 'false' }} GH_AW_AIC: ${{ needs.agent.outputs.aic }} GH_AW_THREAT_DETECTION_AIC: ${{ needs.detection.outputs.aic }} - GH_AW_MAX_AI_CREDITS: "250" + GH_AW_MAX_AI_CREDITS: "300" GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} diff --git a/.github/workflows/daily-arxiv-researcher.md b/.github/workflows/daily-arxiv-researcher.md index 9af14115f51..6024a427179 100644 --- a/.github/workflows/daily-arxiv-researcher.md +++ b/.github/workflows/daily-arxiv-researcher.md @@ -12,7 +12,7 @@ permissions: engine: claude timeout-minutes: 20 -max-ai-credits: 250 +max-ai-credits: 300 tools: cache-memory: @@ -50,7 +50,7 @@ steps: fs.mkdirSync(BASE_DIR, { recursive: true }); - const ARXIV_URL = 'https://export.arxiv.org/api/query?search_query=(cat:cs.AI+OR+cat:cs.SE+OR+cat:cs.LG)+AND+(agentic+OR+%22multi-agent%22+OR+%22llm+agent%22+OR+%22workflow+automation%22+OR+%22code+generation%22+OR+%22ai+agent%22)&max_results=40&sortBy=submittedDate&sortOrder=descending'; + const ARXIV_URL = 'https://export.arxiv.org/api/query?search_query=(cat:cs.AI+OR+cat:cs.SE+OR+cat:cs.LG)+AND+(agentic+OR+%22multi-agent%22+OR+%22llm+agent%22+OR+%22workflow+automation%22+OR+%22code+generation%22+OR+%22ai+agent%22)&max_results=25&sortBy=submittedDate&sortOrder=descending'; let xml = ''; try { @@ -96,7 +96,7 @@ steps: papers.push({ id: arxivId, title: getText('title', entry), - abstract: getText('summary', entry).slice(0, 1200), + abstract: getText('summary', entry).slice(0, 800), authors: getAllText('name', entry).slice(0, 3), published: getText('published', entry).slice(0, 10), categories: getAllAttr('category', 'term', entry).slice(0, 3), @@ -161,7 +161,7 @@ Stop after the ledger update. ## Step 3: Extract Improvement Opportunities -For each relevant paper (max 8), invoke the `opportunity-extractor` sub-agent with the full paper object. +For each relevant paper (max 5), invoke the `opportunity-extractor` sub-agent with the full paper object. Collect the returned opportunity objects. @@ -204,44 +204,7 @@ Write back — no colons in filenames. **If actionable opportunities were found**: create a discussion titled: `[arXiv Research] Agentic Workflow Improvements — YYYY-MM-DD` -Use `###` or lower for all headers inside the discussion body. Never use `#` or `##`. - -Discussion body structure: - -``` -### Summary - -N papers screened, M relevant, K opportunities identified. - ---- - -### Actionable Opportunities - -(one section per opportunity, grouped by area when there are multiple in the same area) - -#### [AREA] — Short Opportunity Title - -**Paper**: [Title](URL) -**Authors**: Author A, Author B -**Published**: YYYY-MM-DD -**Effort**: low / medium / high -**Rationale**: 2-3 sentences mapping the paper's mechanism to a specific gh-aw component. - ---- - -### Papers Analyzed - -| Paper | Published | Relevant | Area | -|---|---|---|---| -| [Title](URL) | YYYY-MM-DD | Yes / No | area or — | - ---- - -### Next Steps - -- [ ] Investigate: opportunity 1 (effort: low) -- [ ] Investigate: opportunity 2 (effort: medium) -``` +Use the `discussion-template` skill to format the discussion body. **If no actionable opportunities were found** (but papers were processed and ledger updated): call `noop` with message: "Processed N papers (M relevant), no actionable gh-aw improvements identified today." @@ -309,3 +272,47 @@ Identify the single most actionable improvement the paper suggests for gh-aw — Output: exactly one line of valid JSON — no other text: `{"opportunity": "concise one-sentence action", "area": "token-optimization|safe-outputs|workflow-compilation|multi-agent|prompt-engineering|network|security|other", "effort": "low|medium|high", "rationale": "2-3 sentences naming the paper mechanism and the specific gh-aw component it improves"}` + +## skill: `discussion-template` +--- +description: Discussion body structure and formatting rules for the arXiv research output +--- + +Use `###` or lower for all headers inside the discussion body. Never use `#` or `##`. + +Discussion body structure: + +``` +### Summary + +N papers screened, M relevant, K opportunities identified. + +--- + +### Actionable Opportunities + +(one section per opportunity, grouped by area when there are multiple in the same area) + +#### [AREA] — Short Opportunity Title + +**Paper**: [Title](URL) +**Authors**: Author A, Author B +**Published**: YYYY-MM-DD +**Effort**: low / medium / high +**Rationale**: 2-3 sentences mapping the paper's mechanism to a specific gh-aw component. + +--- + +### Papers Analyzed + +| Paper | Published | Relevant | Area | +|---|---|---|---| +| [Title](URL) | YYYY-MM-DD | Yes / No | area or — | + +--- + +### Next Steps + +- [ ] Investigate: opportunity 1 (effort: low) +- [ ] Investigate: opportunity 2 (effort: medium) +``` From a3a93894129d29f203e4efde08003fb21005139a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 12:41:10 +0000 Subject: [PATCH 4/4] fix(arxiv-researcher): add small-model relevance-ranker to filter before large-model extractor Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../workflows/daily-arxiv-researcher.lock.yml | 2 +- .github/workflows/daily-arxiv-researcher.md | 33 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/.github/workflows/daily-arxiv-researcher.lock.yml b/.github/workflows/daily-arxiv-researcher.lock.yml index 83e5aad5059..cc6dff10cd9 100644 --- a/.github/workflows/daily-arxiv-researcher.lock.yml +++ b/.github/workflows/daily-arxiv-researcher.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"368041f958b1c4852a46b2ab745d61898bb01711f681c65fc20795769b0647bd","body_hash":"e76340573dfb7be7903542b1d9dfb14f0aa7de072d4ef3647340094d89a8d0d5","strict":true,"agent_id":"claude","engine_versions":{"claude":"2.1.220"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"368041f958b1c4852a46b2ab745d61898bb01711f681c65fc20795769b0647bd","body_hash":"5a258881db236745c0c019d07b5120bd8ea6197a371e3a3719ee2cae33dcb875","strict":true,"agent_id":"claude","engine_versions":{"claude":"2.1.220"}} # gh-aw-manifest: {"version":1,"secrets":["ANTHROPIC_API_KEY","COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.43","digest":"sha256:04e2d1987a565000a8f114b89d806ae7a3864dd4f944be65275b28c93d8690e6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.43@sha256:04e2d1987a565000a8f114b89d806ae7a3864dd4f944be65275b28c93d8690e6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.43","digest":"sha256:d85f57975af5ea23af4996e41ed73fbc8f5b4a47402472bfe82e508f352cb0c1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.43@sha256:d85f57975af5ea23af4996e41ed73fbc8f5b4a47402472bfe82e508f352cb0c1"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.43","digest":"sha256:26be5e0b8c8f4c41c8a59126b29bb5d80b07253597472ded2a16bdd75abcbf9d","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.43@sha256:26be5e0b8c8f4c41c8a59126b29bb5d80b07253597472ded2a16bdd75abcbf9d"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.7","digest":"sha256:7545220a9aca134b71e51193ee0eaf4c50756ebf8fbd25a63ae7556e62815c00","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.7@sha256:7545220a9aca134b71e51193ee0eaf4c50756ebf8fbd25a63ae7556e62815c00"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:0d9f1fb5fd6610c0ac1f5194a38e45a8a1e81f8a390d5142d8e4e6f26a4b3196","pinned_image":"ghcr.io/github/gh-aw-node@sha256:0d9f1fb5fd6610c0ac1f5194a38e45a8a1e81f8a390d5142d8e4e6f26a4b3196"},{"image":"ghcr.io/github/github-mcp-server:v1.8.0","digest":"sha256:d5a18c04b92714c309eb46a2305087e91a4dbd80420f6e462656699f95093520","pinned_image":"ghcr.io/github/github-mcp-server:v1.8.0@sha256:d5a18c04b92714c309eb46a2305087e91a4dbd80420f6e462656699f95093520"}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # diff --git a/.github/workflows/daily-arxiv-researcher.md b/.github/workflows/daily-arxiv-researcher.md index 6024a427179..f07ba9f0078 100644 --- a/.github/workflows/daily-arxiv-researcher.md +++ b/.github/workflows/daily-arxiv-researcher.md @@ -159,9 +159,18 @@ If no papers are relevant, proceed to Step 4 to update the ledger, then call `no "N papers screened, none relevant to gh-aw today." Stop after the ledger update. +## Step 2b: Rank Relevant Papers + +For each relevant paper, invoke the `relevance-ranker` sub-agent with: +```json +{"title": "...", "abstract": "..."} +``` + +Sort ranked papers by `score` descending. Keep only the top 3. + ## Step 3: Extract Improvement Opportunities -For each relevant paper (max 5), invoke the `opportunity-extractor` sub-agent with the full paper object. +For each top-ranked paper (max 3), invoke the `opportunity-extractor` sub-agent with the full paper object. Collect the returned opportunity objects. @@ -248,6 +257,28 @@ Input: `{"title": "...", "abstract": "..."}` as a JSON string. Output: exactly one line of valid JSON — no other text: `{"relevant": true, "reason": "one sentence"}` or `{"relevant": false, "reason": "one sentence"}` +## agent: `relevance-ranker` +--- +description: Scores a relevant arXiv paper by actionability for GitHub Agentic Workflows +model: small +--- + +Score a relevant arXiv paper by how actionable it is for GitHub Agentic Workflows (gh-aw). + +gh-aw compiles markdown workflows into GitHub Actions YAML with pluggable AI engines, safe-outputs typed writes, network firewall, token optimization, sub-agents, cache-memory, repo-memory, and multi-agent orchestration. + +Score 1–5: +- 5: describes a new technique, pattern, or mechanism directly applicable to a specific gh-aw component +- 4: strong connection to gh-aw but requires adaptation +- 3: loosely related; possible indirect improvement +- 2: tangential; only marginally relevant to gh-aw +- 1: relevant to AI/agents generally but no clear gh-aw application + +Input: `{"title": "...", "abstract": "..."}` as a JSON string. + +Output: exactly one line of valid JSON — no other text: +`{"score": <1-5>, "reason": "one sentence"}` + ## agent: `opportunity-extractor` --- description: Extracts a specific actionable improvement for gh-aw from a relevant arXiv paper