From 6a2d079847c4392bd69bc4e38bdcf29579836690 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 24 Apr 2026 21:01:29 +0000
Subject: [PATCH 1/3] Initial plan
From 27ff880fbecfc53198a004aaa23c7cd1d3d60cd4 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 24 Apr 2026 21:09:01 +0000
Subject: [PATCH 2/3] fix: optimize docs-noob-tester to reduce token usage
(~60% reduction)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Move deterministic setup (npm install, server start, readiness poll,
bridge IP detection) to pre-agent-steps, saving ~600K–900K tokens/run
by eliminating ~10–15 agent setup turns
- Slim duplicate Playwright connectivity fallback from prompt body
(already covered by shared/docs-server-lifecycle.md import)
- Reduce timeout-minutes: 45 → 30 (observed run was 25.3min, post-
optimization should fit well within 30min)
- Agent now reads server URL from /tmp/gh-aw/agent/server-url.txt
- Renumber prompt steps 2–6 → 1–5 reflecting removed setup step
- Recompile lock file"
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/c7cceec6-aeff-4e6a-9099-d878ea038089
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
---
.github/workflows/docs-noob-tester.lock.yml | 41 +++++---
.github/workflows/docs-noob-tester.md | 109 ++++++++------------
2 files changed, 70 insertions(+), 80 deletions(-)
diff --git a/.github/workflows/docs-noob-tester.lock.yml b/.github/workflows/docs-noob-tester.lock.yml
index ebd74c84df3..bcba438dd86 100644
--- a/.github/workflows/docs-noob-tester.lock.yml
+++ b/.github/workflows/docs-noob-tester.lock.yml
@@ -1,4 +1,4 @@
-# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"0eb625c4542bfb64a532c897b2d42ffcf1099f60d4ebcdb7800f155b031d39e4","strict":true,"agent_id":"copilot"}
+# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"cd6b331a9e1ffca4a20184f405baa3c964127cf9d33df698371694b856cd08ff","strict":true,"agent_id":"copilot"}
# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_ENDPOINT","GH_AW_OTEL_HEADERS","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28","digest":"sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28","digest":"sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28","digest":"sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.0"},{"image":"ghcr.io/github/github-mcp-server:v1.0.2"},{"image":"mcr.microsoft.com/playwright/mcp","digest":"sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2","pinned_image":"mcr.microsoft.com/playwright/mcp@sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]}
# ___ _ _
# / _ \ | | (_)
@@ -186,23 +186,23 @@ jobs:
run: |
bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh"
{
- cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF'
+ cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
- GH_AW_PROMPT_144af8a2cedba836_EOF
+ GH_AW_PROMPT_2267e89649568e7e_EOF
cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/playwright_prompt.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md"
- cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF'
+ cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
Tools: create_discussion, upload_asset(max:10), missing_tool, missing_data, noop
upload_asset: provide a file path; returns a URL; assets are published after the workflow completes (safeoutputs).
- GH_AW_PROMPT_144af8a2cedba836_EOF
+ GH_AW_PROMPT_2267e89649568e7e_EOF
cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md"
- cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF'
+ cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
The following GitHub context information is available for this workflow:
{{#if __GH_AW_GITHUB_ACTOR__ }}
@@ -231,16 +231,16 @@ jobs:
{{/if}}
- GH_AW_PROMPT_144af8a2cedba836_EOF
+ GH_AW_PROMPT_2267e89649568e7e_EOF
cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md"
- cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF'
+ cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
{{#runtime-import .github/workflows/shared/docs-server-lifecycle.md}}
{{#runtime-import .github/workflows/shared/keep-it-short.md}}
{{#runtime-import .github/workflows/shared/reporting.md}}
{{#runtime-import .github/workflows/shared/observability-otlp.md}}
{{#runtime-import .github/workflows/docs-noob-tester.md}}
- GH_AW_PROMPT_144af8a2cedba836_EOF
+ GH_AW_PROMPT_2267e89649568e7e_EOF
} > "$GH_AW_PROMPT"
- name: Interpolate variables and render templates
uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
@@ -435,6 +435,17 @@ jobs:
GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode"
GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md opencode.jsonc"
run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh"
+ - name: Install docs dependencies
+ run: |
+ cd "${{ github.workspace }}/docs"
+ npm install
+ - name: Start documentation server
+ run: "cd \"${{ github.workspace }}/docs\"\nnohup npm run dev -- --host 0.0.0.0 --port 4321 > /tmp/preview.log 2>&1 &\nPID=$!\necho $PID > /tmp/server.pid\necho \"Server PID: $PID\"\n"
+ - name: Wait for server readiness
+ run: "for i in {1..45}; do\n STATUS=$(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:4321/gh-aw/)\n [ \"$STATUS\" = \"200\" ] && echo \"Server ready at http://localhost:4321/gh-aw/!\" && break\n echo \"Waiting for server... ($i/45) (status: $STATUS)\" && sleep 3\ndone\n"
+ - name: Detect bridge IP and write server URL
+ run: "SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')\nif [ -z \"$SERVER_IP\" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi\nmkdir -p /tmp/gh-aw/agent\necho \"http://${SERVER_IP}:4321/gh-aw/\" > /tmp/gh-aw/agent/server-url.txt\necho \"Playwright server URL: http://${SERVER_IP}:4321/gh-aw/\"\n"
+
- name: Download container images
run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474 ghcr.io/github/gh-aw-mcpg:v0.3.0 ghcr.io/github/github-mcp-server:v1.0.2 mcr.microsoft.com/playwright/mcp@sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f
- name: Write Safe Outputs Config
@@ -444,9 +455,9 @@ jobs:
mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs"
mkdir -p /tmp/gh-aw/safeoutputs
mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs
- cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_904207208c078916_EOF
+ cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF
{"create_discussion":{"category":"audits","close_older_discussions":true,"expires":24,"fallback_to_issue":true,"max":1,"title_prefix":"[docs-noob-tester] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{},"upload_asset":{"allowed-exts":[".png",".jpg",".jpeg",".svg"],"branch":"assets/${GITHUB_WORKFLOW}","max":10,"max-size":10240}}
- GH_AW_SAFE_OUTPUTS_CONFIG_904207208c078916_EOF
+ GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF
- name: Write Safe Outputs Tools
env:
GH_AW_TOOLS_META_JSON: |
@@ -655,7 +666,7 @@ jobs:
mkdir -p /home/runner/.copilot
GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node)
- cat << GH_AW_MCP_CONFIG_a05ff7e60f941289_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs"
+ cat << GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs"
{
"mcpServers": {
"github": {
@@ -716,7 +727,7 @@ jobs:
}
}
}
- GH_AW_MCP_CONFIG_a05ff7e60f941289_EOF
+ GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF
- name: Mount MCP servers as CLIs
id: mount-mcp-clis
continue-on-error: true
@@ -737,7 +748,7 @@ jobs:
- name: Execute GitHub Copilot CLI
id: agentic_execution
# Copilot CLI tool arguments (sorted):
- timeout-minutes: 45
+ timeout-minutes: 30
run: |
set -o pipefail
touch /tmp/gh-aw/agent-step-summary.md
@@ -1077,7 +1088,7 @@ jobs:
GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }}
GH_AW_GROUP_REPORTS: "false"
GH_AW_FAILURE_REPORT_AS_ISSUE: "true"
- GH_AW_TIMEOUT_MINUTES: "45"
+ GH_AW_TIMEOUT_MINUTES: "30"
with:
github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
script: |
diff --git a/.github/workflows/docs-noob-tester.md b/.github/workflows/docs-noob-tester.md
index 260082c0e90..9de4c19ffb5 100644
--- a/.github/workflows/docs-noob-tester.md
+++ b/.github/workflows/docs-noob-tester.md
@@ -9,7 +9,7 @@ permissions:
issues: read
pull-requests: read
engine: copilot
-timeout-minutes: 45
+timeout-minutes: 30
runtimes:
node:
version: "22"
@@ -36,6 +36,32 @@ imports:
expires: 1d
- shared/docs-server-lifecycle.md
- shared/keep-it-short.md
+pre-agent-steps:
+ - name: Install docs dependencies
+ run: |
+ cd "${{ github.workspace }}/docs"
+ npm install
+ - name: Start documentation server
+ run: |
+ cd "${{ github.workspace }}/docs"
+ nohup npm run dev -- --host 0.0.0.0 --port 4321 > /tmp/preview.log 2>&1 &
+ PID=$!
+ echo $PID > /tmp/server.pid
+ echo "Server PID: $PID"
+ - name: Wait for server readiness
+ run: |
+ for i in {1..45}; do
+ STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:4321/gh-aw/)
+ [ "$STATUS" = "200" ] && echo "Server ready at http://localhost:4321/gh-aw/!" && break
+ echo "Waiting for server... ($i/45) (status: $STATUS)" && sleep 3
+ done
+ - name: Detect bridge IP and write server URL
+ run: |
+ SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')
+ if [ -z "$SERVER_IP" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi
+ mkdir -p /tmp/gh-aw/agent
+ echo "http://${SERVER_IP}:4321/gh-aw/" > /tmp/gh-aw/agent/server-url.txt
+ echo "Playwright server URL: http://${SERVER_IP}:4321/gh-aw/"
features:
mcp-cli: true
copilot-requests: true
@@ -53,77 +79,30 @@ You are a brand new user trying to get started with GitHub Agentic Workflows for
## Your Mission
-Act as a complete beginner who has never used GitHub Agentic Workflows before. Build and navigate the documentation site, follow tutorials step-by-step, and document any issues you encounter.
+Act as a complete beginner who has never used GitHub Agentic Workflows before. Navigate the documentation site, follow tutorials step-by-step, and document any issues you encounter.
-## Step 1: Build and Serve Documentation Site
+> The documentation server is already running. Read the Playwright server URL from `/tmp/gh-aw/agent/server-url.txt`:
+> ```bash
+> cat /tmp/gh-aw/agent/server-url.txt
+> ```
-Navigate to the docs folder and start the documentation site:
-
-```bash
-cd ${{ github.workspace }}/docs
-npm install
-```
-
-Follow the shared **Documentation Server Lifecycle Management** instructions:
-1. Start the preview server (section "Starting the Documentation Preview Server")
-2. Wait for server readiness (section "Waiting for Server Readiness")
-
-**Get the bridge IP for Playwright access** (run this after the server is ready):
-
-```bash
-SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')
-if [ -z "$SERVER_IP" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi
-echo "Playwright server URL: http://${SERVER_IP}:4321/gh-aw/"
-```
-
-Use `http://${SERVER_IP}:4321/gh-aw/` (NOT `localhost:4321`) for all Playwright navigation below.
-
-## Step 2: Navigate Documentation as a Noob
+## Step 1: Navigate Documentation as a Noob
**IMPORTANT: Using Playwright in gh-aw Workflows**
-Playwright is provided through an MCP server interface. Use the bridge IP obtained in Step 1 for all navigation:
-
- ✅ **Correct**: `browser_run_code` with `page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 })`
-- ✅ **Correct**: `browser_navigate` to `http://${SERVER_IP}:4321/gh-aw/` (use the bridge IP, NOT localhost)
-- ❌ **Incorrect**: Using `http://localhost:4321/...` — Playwright runs with `--network host` so its localhost is the Docker host, not the agent container
-
-**⚠️ Playwright Connectivity — If Playwright times out or fails:**
-If `browser_navigate` or `browser_run_code` returns `net::ERR_CONNECTION_TIMED_OUT` or a timeout error, **do not attempt to debug the network or install alternative browsers** (chromium, puppeteer, etc.). This is a known network isolation constraint. Instead:
-1. Skip the Playwright navigation step immediately
-2. Use the following command to fetch and analyze page content via curl:
- ```bash
- curl -s http://localhost:4321/gh-aw/ | python3 -c "
- import sys, re
- html = sys.stdin.read()
- text = re.sub(r'<[^>]+>', '', html)
- print(text[:5000])
- "
- ```
-3. Note in the report that visual screenshots were unavailable
-
-**⚠️ CRITICAL: Navigation Timeout Prevention**
-
-The Astro development server loads many JavaScript modules per page. Always use `waitUntil: 'domcontentloaded'`:
-
-```javascript
-// ALWAYS use domcontentloaded - replace SERVER_IP with the actual IP from Step 1
-mcp__playwright__browser_run_code({
- code: `async (page) => {
- await page.goto('http://SERVER_IP:4321/gh-aw/', { waitUntil: 'domcontentloaded', timeout: 30000 });
- return { url: page.url(), title: await page.title() };
- }`
-})
-```
+- ❌ **Incorrect**: Using `http://localhost:4321/...` — use the bridge IP from `/tmp/gh-aw/agent/server-url.txt`
+
+**⚠️ CRITICAL: Navigation Timeout Prevention** — Always use `waitUntil: 'domcontentloaded'` to prevent timeout on the Vite dev server. If Playwright connectivity fails, see the shared **Documentation Server Lifecycle Management** fallback instructions.
-Using Playwright, visit exactly these 3 pages and stop:
+Using Playwright, visit exactly these 3 pages and stop (use the Playwright server URL read from `/tmp/gh-aw/agent/server-url.txt`):
-1. **Visit the home page** at `http://${SERVER_IP}:4321/gh-aw/`
+1. **Visit the home page** (e.g. `http://:4321/gh-aw/`)
- Take a screenshot
- Note: Is it immediately clear what this tool does?
- Note: Can you quickly find the "Get Started" or "Quick Start" link?
-2. **Follow the Quick Start Guide** at `http://${SERVER_IP}:4321/gh-aw/setup/quick-start/`
+2. **Follow the Quick Start Guide** (e.g. `http://:4321/gh-aw/setup/quick-start/`)
- Take screenshots of each major section
- Try to understand each step from a beginner's perspective
- Questions to consider:
@@ -133,14 +112,14 @@ Using Playwright, visit exactly these 3 pages and stop:
- Do code examples work as shown?
- Are error messages explained?
-3. **Check the CLI Commands page** at `http://${SERVER_IP}:4321/gh-aw/setup/cli/`
+3. **Check the CLI Commands page** (e.g. `http://:4321/gh-aw/setup/cli/`)
- Take a screenshot
- Note: Are the most important commands highlighted?
- Note: Are examples provided for common use cases?
After visiting all 3 pages, immediately proceed to the report.
-## Step 3: Identify Pain Points
+## Step 2: Identify Pain Points
As you navigate, specifically look for:
@@ -166,7 +145,7 @@ As you navigate, specifically look for:
- Useful screenshots or diagrams
- Logical flow
-## Step 4: Take Screenshots
+## Step 3: Take Screenshots
For each confusing or broken area:
- Take a screenshot showing the issue
@@ -175,7 +154,7 @@ For each confusing or broken area:
- Upload the screenshot by calling the `upload_asset` safe-output tool with the absolute file path `path: "/tmp/gh-aw/screenshots/.png"`.
Record the returned asset URL.
-## Step 5: Create Discussion Report
+## Step 4: Create Discussion Report
Create a GitHub discussion titled "📚 Documentation Noob Test Report - [Date]" with:
@@ -206,7 +185,7 @@ For each uploaded screenshot, include its asset URL. Format:
Label the discussion with: `documentation`, `user-experience`, `automated-testing`
-## Step 6: Cleanup
+## Step 5: Cleanup
Follow the shared **Documentation Server Lifecycle Management** instructions for cleanup (section "Stopping the Documentation Server").
From 97e3077ebf8c0fbc6f1f8c151c7bdef48331bbbb Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 24 Apr 2026 21:12:41 +0000
Subject: [PATCH 3/3] fix: address code review feedback on docs-noob-tester
optimization
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Add comment explaining the 45-iteration wait loop (135s max wait)
- Improve Playwright example to show reading URL from server-url.txt
- Fix 'Vite dev server' → 'Astro development server' for accuracy
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/c7cceec6-aeff-4e6a-9099-d878ea038089
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
---
.github/workflows/docs-noob-tester.lock.yml | 28 ++++++++++-----------
.github/workflows/docs-noob-tester.md | 6 ++---
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/.github/workflows/docs-noob-tester.lock.yml b/.github/workflows/docs-noob-tester.lock.yml
index bcba438dd86..e038a0ffff9 100644
--- a/.github/workflows/docs-noob-tester.lock.yml
+++ b/.github/workflows/docs-noob-tester.lock.yml
@@ -1,4 +1,4 @@
-# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"cd6b331a9e1ffca4a20184f405baa3c964127cf9d33df698371694b856cd08ff","strict":true,"agent_id":"copilot"}
+# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"6d6a148d61f9979dc8ddbb2a7bd055ab2b98a0fd9422d6e55e1a44dc58ee741e","strict":true,"agent_id":"copilot"}
# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_ENDPOINT","GH_AW_OTEL_HEADERS","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28","digest":"sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28","digest":"sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28","digest":"sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.0"},{"image":"ghcr.io/github/github-mcp-server:v1.0.2"},{"image":"mcr.microsoft.com/playwright/mcp","digest":"sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2","pinned_image":"mcr.microsoft.com/playwright/mcp@sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]}
# ___ _ _
# / _ \ | | (_)
@@ -186,23 +186,23 @@ jobs:
run: |
bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh"
{
- cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
+ cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF'
- GH_AW_PROMPT_2267e89649568e7e_EOF
+ GH_AW_PROMPT_f65c908042dcbe78_EOF
cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/playwright_prompt.md"
cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md"
- cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
+ cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF'
Tools: create_discussion, upload_asset(max:10), missing_tool, missing_data, noop
upload_asset: provide a file path; returns a URL; assets are published after the workflow completes (safeoutputs).
- GH_AW_PROMPT_2267e89649568e7e_EOF
+ GH_AW_PROMPT_f65c908042dcbe78_EOF
cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md"
- cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
+ cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF'
The following GitHub context information is available for this workflow:
{{#if __GH_AW_GITHUB_ACTOR__ }}
@@ -231,16 +231,16 @@ jobs:
{{/if}}
- GH_AW_PROMPT_2267e89649568e7e_EOF
+ GH_AW_PROMPT_f65c908042dcbe78_EOF
cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md"
- cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF'
+ cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF'
{{#runtime-import .github/workflows/shared/docs-server-lifecycle.md}}
{{#runtime-import .github/workflows/shared/keep-it-short.md}}
{{#runtime-import .github/workflows/shared/reporting.md}}
{{#runtime-import .github/workflows/shared/observability-otlp.md}}
{{#runtime-import .github/workflows/docs-noob-tester.md}}
- GH_AW_PROMPT_2267e89649568e7e_EOF
+ GH_AW_PROMPT_f65c908042dcbe78_EOF
} > "$GH_AW_PROMPT"
- name: Interpolate variables and render templates
uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9
@@ -442,7 +442,7 @@ jobs:
- name: Start documentation server
run: "cd \"${{ github.workspace }}/docs\"\nnohup npm run dev -- --host 0.0.0.0 --port 4321 > /tmp/preview.log 2>&1 &\nPID=$!\necho $PID > /tmp/server.pid\necho \"Server PID: $PID\"\n"
- name: Wait for server readiness
- run: "for i in {1..45}; do\n STATUS=$(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:4321/gh-aw/)\n [ \"$STATUS\" = \"200\" ] && echo \"Server ready at http://localhost:4321/gh-aw/!\" && break\n echo \"Waiting for server... ($i/45) (status: $STATUS)\" && sleep 3\ndone\n"
+ run: "for i in {1..45}; do # 45 attempts × 3s = 135s max wait\n STATUS=$(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:4321/gh-aw/)\n [ \"$STATUS\" = \"200\" ] && echo \"Server ready at http://localhost:4321/gh-aw/!\" && break\n echo \"Waiting for server... ($i/45) (status: $STATUS)\" && sleep 3\ndone\n"
- name: Detect bridge IP and write server URL
run: "SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')\nif [ -z \"$SERVER_IP\" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi\nmkdir -p /tmp/gh-aw/agent\necho \"http://${SERVER_IP}:4321/gh-aw/\" > /tmp/gh-aw/agent/server-url.txt\necho \"Playwright server URL: http://${SERVER_IP}:4321/gh-aw/\"\n"
@@ -455,9 +455,9 @@ jobs:
mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs"
mkdir -p /tmp/gh-aw/safeoutputs
mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs
- cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF
+ cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_f2225c1dad1fcafb_EOF
{"create_discussion":{"category":"audits","close_older_discussions":true,"expires":24,"fallback_to_issue":true,"max":1,"title_prefix":"[docs-noob-tester] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{},"upload_asset":{"allowed-exts":[".png",".jpg",".jpeg",".svg"],"branch":"assets/${GITHUB_WORKFLOW}","max":10,"max-size":10240}}
- GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF
+ GH_AW_SAFE_OUTPUTS_CONFIG_f2225c1dad1fcafb_EOF
- name: Write Safe Outputs Tools
env:
GH_AW_TOOLS_META_JSON: |
@@ -666,7 +666,7 @@ jobs:
mkdir -p /home/runner/.copilot
GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node)
- cat << GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs"
+ cat << GH_AW_MCP_CONFIG_cbb58886828055bc_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs"
{
"mcpServers": {
"github": {
@@ -727,7 +727,7 @@ jobs:
}
}
}
- GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF
+ GH_AW_MCP_CONFIG_cbb58886828055bc_EOF
- name: Mount MCP servers as CLIs
id: mount-mcp-clis
continue-on-error: true
diff --git a/.github/workflows/docs-noob-tester.md b/.github/workflows/docs-noob-tester.md
index 9de4c19ffb5..bc9011ff709 100644
--- a/.github/workflows/docs-noob-tester.md
+++ b/.github/workflows/docs-noob-tester.md
@@ -50,7 +50,7 @@ pre-agent-steps:
echo "Server PID: $PID"
- name: Wait for server readiness
run: |
- for i in {1..45}; do
+ for i in {1..45}; do # 45 attempts × 3s = 135s max wait
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:4321/gh-aw/)
[ "$STATUS" = "200" ] && echo "Server ready at http://localhost:4321/gh-aw/!" && break
echo "Waiting for server... ($i/45) (status: $STATUS)" && sleep 3
@@ -90,10 +90,10 @@ Act as a complete beginner who has never used GitHub Agentic Workflows before. N
**IMPORTANT: Using Playwright in gh-aw Workflows**
-- ✅ **Correct**: `browser_run_code` with `page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 })`
+- ✅ **Correct**: Read the URL from the file then navigate: `SERVER_URL=$(cat /tmp/gh-aw/agent/server-url.txt)` and use `browser_run_code` with `page.goto(SERVER_URL, { waitUntil: 'domcontentloaded', timeout: 30000 })`
- ❌ **Incorrect**: Using `http://localhost:4321/...` — use the bridge IP from `/tmp/gh-aw/agent/server-url.txt`
-**⚠️ CRITICAL: Navigation Timeout Prevention** — Always use `waitUntil: 'domcontentloaded'` to prevent timeout on the Vite dev server. If Playwright connectivity fails, see the shared **Documentation Server Lifecycle Management** fallback instructions.
+**⚠️ CRITICAL: Navigation Timeout Prevention** — Always use `waitUntil: 'domcontentloaded'` to prevent timeout on the Astro development server. If Playwright connectivity fails, see the shared **Documentation Server Lifecycle Management** fallback instructions.
Using Playwright, visit exactly these 3 pages and stop (use the Playwright server URL read from `/tmp/gh-aw/agent/server-url.txt`):