From 2bfde2e17d448038a4e5335df6d5ee28a076de01 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 00:00:52 +0000 Subject: [PATCH 1/2] Initial plan From eedddef746c44ce58a75a7f016fbd98678d14300 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 06:15:39 +0000 Subject: [PATCH 2/2] fix: prevent data-gathering loop in news-evening-analysis workflow Root cause: Agent entered a data-gathering loop making 6+ duplicate rounds of the same MCP queries, exhausting context/time without generating articles or calling safe output. Fixes: - Add anti-loop rules: each MCP tool called AT MOST ONCE per run - Add forward-only phase progression rule - Add explicit time-check bash commands between phases - Reduce MCP query limits to prevent context overflow - Add DATA PHASE COMPLETE marker after data gathering - Simplify to EN/SV only (translations by news-translate workflow) - Inline Swedish CONTENT_LABELS to prevent large file reads - Recompile lock file with gh aw compile Co-authored-by: pethers <1726836+pethers@users.noreply.github.com> --- .github/aw/actions-lock.json | 5 + .../workflows/news-evening-analysis.lock.yml | 99 ++++++------- .github/workflows/news-evening-analysis.md | 136 ++++++++++-------- 3 files changed, 128 insertions(+), 112 deletions(-) diff --git a/.github/aw/actions-lock.json b/.github/aw/actions-lock.json index ef06b957d1..f15b563605 100644 --- a/.github/aw/actions-lock.json +++ b/.github/aw/actions-lock.json @@ -114,6 +114,11 @@ "repo": "github/gh-aw/actions/setup", "version": "v0.57.2", "sha": "32b3a711a9ee97d38e3989c90af0385aff0066a7" + }, + "github/gh-aw/actions/setup@v0.58.0": { + "repo": "github/gh-aw/actions/setup", + "version": "v0.58.0", + "sha": "cb7966564184443e601bd6135d5fbb534300070e" } } } diff --git a/.github/workflows/news-evening-analysis.lock.yml b/.github/workflows/news-evening-analysis.lock.yml index 84b75b5d9d..3598f079e9 100644 --- a/.github/workflows/news-evening-analysis.lock.yml +++ b/.github/workflows/news-evening-analysis.lock.yml @@ -13,7 +13,7 @@ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ # -# This file was automatically generated by gh-aw (v0.57.2). DO NOT EDIT. +# This file was automatically generated by gh-aw (v0.58.0). DO NOT EDIT. # # To update this file, edit the corresponding .md file and run: # gh aw compile @@ -23,7 +23,7 @@ # # Generates comprehensive evening analysis articles in core languages (EN, SV) with Playwright validation. Translations handled by news-translate workflow. On Saturdays, produces a weekly wrap-up reviewing the full parliamentary week. # -# gh-aw-metadata: {"schema_version":"v2","frontmatter_hash":"6dc11196cb6c0f996b63031af5ada000c7083338501190fd67b58f1cc7fc3212","compiler_version":"v0.57.2"} +# gh-aw-metadata: {"schema_version":"v2","frontmatter_hash":"6dc11196cb6c0f996b63031af5ada000c7083338501190fd67b58f1cc7fc3212","compiler_version":"v0.58.0"} name: "News Evening Analysis" "on": @@ -64,7 +64,7 @@ jobs: secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} steps: - name: Setup Scripts - uses: github/gh-aw/actions/setup@32b3a711a9ee97d38e3989c90af0385aff0066a7 # v0.57.2 + uses: github/gh-aw/actions/setup@cb7966564184443e601bd6135d5fbb534300070e # v0.58.0 with: destination: /opt/gh-aw/actions - name: Generate agentic run info @@ -75,7 +75,7 @@ jobs: GH_AW_INFO_MODEL: "claude-opus-4.6" GH_AW_INFO_VERSION: "" GH_AW_INFO_AGENT_VERSION: "latest" - GH_AW_INFO_CLI_VERSION: "v0.57.2" + GH_AW_INFO_CLI_VERSION: "v0.58.0" GH_AW_INFO_WORKFLOW_NAME: "News Evening Analysis" GH_AW_INFO_EXPERIMENTAL: "false" GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" @@ -245,7 +245,7 @@ jobs: run: bash /opt/gh-aw/actions/print_prompt_summary.sh - name: Upload activation artifact if: success() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: activation path: | @@ -286,7 +286,7 @@ jobs: output_types: ${{ steps.collect_output.outputs.output_types }} steps: - name: Setup Scripts - uses: github/gh-aw/actions/setup@32b3a711a9ee97d38e3989c90af0385aff0066a7 # v0.57.2 + uses: github/gh-aw/actions/setup@cb7966564184443e601bd6135d5fbb534300070e # v0.58.0 with: destination: /opt/gh-aw/actions - name: Checkout repository @@ -331,7 +331,7 @@ jobs: await main(); - name: Install GitHub Copilot CLI run: /opt/gh-aw/actions/install_copilot_cli.sh latest - - name: Install awf binary + - name: Install AWF binary run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.23.0 - name: Determine automatic lockdown mode for GitHub MCP Server id: determine-automatic-lockdown @@ -344,7 +344,7 @@ jobs: const determineAutomaticLockdown = require('/opt/gh-aw/actions/determine_automatic_lockdown.cjs'); await determineAutomaticLockdown(github, context, core); - name: Download container images - run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.23.0 ghcr.io/github/gh-aw-firewall/api-proxy:0.23.0 ghcr.io/github/gh-aw-firewall/squid:0.23.0 ghcr.io/github/gh-aw-mcpg:v0.1.8 ghcr.io/github/github-mcp-server:v0.32.0 node:lts-alpine + run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/gh-aw-firewall/agent:0.23.0 ghcr.io/github/gh-aw-firewall/api-proxy:0.23.0 ghcr.io/github/gh-aw-firewall/squid:0.23.0 ghcr.io/github/gh-aw-mcpg:v0.1.14 ghcr.io/github/github-mcp-server:v0.32.0 node:lts-alpine - name: Write Safe Outputs Config run: | mkdir -p /opt/gh-aw/safeoutputs @@ -353,6 +353,8 @@ jobs: cat > /opt/gh-aw/safeoutputs/config.json << 'GH_AW_SAFE_OUTPUTS_CONFIG_EOF' {"add_comment":{"max":1},"create_pull_request":{"max":1},"dispatch_workflow":{"max":1,"workflow_files":{"news-translate":".lock.yml"},"workflows":["news-translate"]},"missing_data":{},"missing_tool":{},"noop":{"max":1}} GH_AW_SAFE_OUTPUTS_CONFIG_EOF + - name: Write Safe Outputs Tools + run: | cat > /opt/gh-aw/safeoutputs/tools.json << 'GH_AW_SAFE_OUTPUTS_TOOLS_EOF' [ { @@ -742,7 +744,7 @@ jobs: export DEBUG="*" export GH_AW_ENGINE="copilot" - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_LOCKDOWN -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.1.8' + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_LOCKDOWN -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.1.14' mkdir -p /home/runner/.copilot cat << GH_AW_MCP_CONFIG_EOF | bash /opt/gh-aw/actions/start_mcp_gateway.sh @@ -827,7 +829,7 @@ jobs: } GH_AW_MCP_CONFIG_EOF - name: Download activation artifact - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: activation path: /tmp/gh-aw @@ -851,7 +853,7 @@ jobs: GH_AW_PHASE: agent GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} - GH_AW_VERSION: v0.57.2 + GH_AW_VERSION: v0.58.0 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_HEAD_REF: ${{ github.head_ref }} @@ -926,13 +928,11 @@ jobs: - name: Append agent step summary if: always() run: bash /opt/gh-aw/actions/append_agent_step_summary.sh - - name: Upload Safe Outputs + - name: Copy Safe Outputs if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 - with: - name: safe-output - path: ${{ env.GH_AW_SAFE_OUTPUTS }} - if-no-files-found: warn + run: | + mkdir -p /tmp/gh-aw + cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true - name: Ingest agent output id: collect_output if: always() @@ -948,21 +948,6 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('/opt/gh-aw/actions/collect_ndjson_output.cjs'); await main(); - - name: Upload sanitized agent output - if: always() && env.GH_AW_AGENT_OUTPUT - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 - with: - name: agent-output - path: ${{ env.GH_AW_AGENT_OUTPUT }} - if-no-files-found: warn - - name: Upload engine output files - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 - with: - name: agent_outputs - path: | - /tmp/gh-aw/sandbox/agent/logs/ - /tmp/gh-aw/redacted-urls.log - if-no-files-found: ignore - name: Parse agent logs for step summary if: always() uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 @@ -1001,15 +986,19 @@ jobs: - name: Upload agent artifacts if: always() continue-on-error: true - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: - name: agent-artifacts + name: agent path: | /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/sandbox/agent/logs/ + /tmp/gh-aw/redacted-urls.log /tmp/gh-aw/mcp-logs/ /tmp/gh-aw/sandbox/firewall/logs/ /tmp/gh-aw/agent-stdio.log /tmp/gh-aw/agent/ + /tmp/gh-aw/safeoutputs.jsonl + /tmp/gh-aw/agent_output.json /tmp/gh-aw/aw-*.patch if-no-files-found: ignore # --- Threat Detection (inline) --- @@ -1086,7 +1075,7 @@ jobs: COPILOT_MODEL: claude-opus-4.6 GH_AW_PHASE: detection GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_VERSION: v0.57.2 + GH_AW_VERSION: v0.58.0 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_HEAD_REF: ${{ github.head_ref }} @@ -1111,9 +1100,9 @@ jobs: await main(); - name: Upload threat detection log if: always() && steps.detection_guard.outputs.run_detection == 'true' - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: - name: threat-detection.log + name: detection path: /tmp/gh-aw/threat-detection/detection.log if-no-files-found: ignore - name: Set detection conclusion @@ -1159,22 +1148,22 @@ jobs: total_count: ${{ steps.missing_tool.outputs.total_count }} steps: - name: Setup Scripts - uses: github/gh-aw/actions/setup@32b3a711a9ee97d38e3989c90af0385aff0066a7 # v0.57.2 + uses: github/gh-aw/actions/setup@cb7966564184443e601bd6135d5fbb534300070e # v0.58.0 with: destination: /opt/gh-aw/actions - name: Download agent output artifact id: download-agent-output continue-on-error: true - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ + name: agent + path: /tmp/gh-aw/ - name: Setup agent output environment variable if: steps.download-agent-output.outcome == 'success' run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_ENV" - name: Process No-Op Messages id: noop uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 @@ -1290,27 +1279,27 @@ jobs: process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: - name: Setup Scripts - uses: github/gh-aw/actions/setup@32b3a711a9ee97d38e3989c90af0385aff0066a7 # v0.57.2 + uses: github/gh-aw/actions/setup@cb7966564184443e601bd6135d5fbb534300070e # v0.58.0 with: destination: /opt/gh-aw/actions - name: Download agent output artifact id: download-agent-output continue-on-error: true - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: agent-output - path: /tmp/gh-aw/safeoutputs/ + name: agent + path: /tmp/gh-aw/ - name: Setup agent output environment variable if: steps.download-agent-output.outcome == 'success' run: | - mkdir -p /tmp/gh-aw/safeoutputs/ - find "/tmp/gh-aw/safeoutputs/" -type f -print - echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV" + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_ENV" - name: Download patch artifact continue-on-error: true - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: agent-artifacts + name: agent path: /tmp/gh-aw/ - name: Checkout repository if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'create_pull_request')) @@ -1351,9 +1340,9 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('/opt/gh-aw/actions/safe_output_handler_manager.cjs'); await main(); - - name: Upload safe output items manifest + - name: Upload Safe Output Items Manifest if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: safe-output-items path: /tmp/safe-output-items.jsonl diff --git a/.github/workflows/news-evening-analysis.md b/.github/workflows/news-evening-analysis.md index b1fdca110e..b0f7944b0b 100644 --- a/.github/workflows/news-evening-analysis.md +++ b/.github/workflows/news-evening-analysis.md @@ -120,6 +120,8 @@ You are the **Evening Political Analyst** for Riksdagsmonitor. Generate comprehe 3. Safe output tools are **always in your tool list**. NEVER search for them via bash. 4. **NEVER** write your own MCP HTTP/JSON-RPC client. Use the scripts or direct tool calls only. 5. Exiting without calling a safe output tool = workflow failure. +6. **NEVER re-query MCP data you already received.** Each MCP tool must be called AT MOST ONCE per run. If you already have data from `get_calendar_events`, `search_voteringar`, etc., use the results you have — do NOT call them again. Duplicate queries waste time and context. If a query fails or times out, retry ONCE, then proceed with available data. +7. **Move forward, never backward.** Once you complete a phase (Setup → Data → Generate → Validate → PR), NEVER go back to a previous phase. Mark each phase complete with a bash echo before proceeding. ## ⏱️ Time Budget (45 minutes) @@ -130,12 +132,25 @@ START_TIME=$(date +%s) | Phase | Minutes | Action | |-------|---------|--------| | Setup | 0–3 | Date check, `get_sync_status()`, determine day type | -| Data | 3–10 | Query MCP tools for parliamentary activity | -| Generate | 10–30 | Run generation script OR manual synthesis (see Step 3) | -| Validate | 30–38 | Translate, validate, commit | +| Data | 3–8 | Query MCP tools ONCE for parliamentary activity | +| Generate | 8–30 | Generate EN and SV articles from data already gathered | +| Validate | 30–38 | Validate, commit | | PR | 38–43 | `safeoutputs___create_pull_request` | -**Hard cutoffs** — check elapsed time before each phase: +**Hard cutoffs** — run this bash check before EVERY new phase: +```bash +source /tmp/gh-aw/agent/timing.env +ELAPSED=$(( $(date +%s) - START_TIME )) +ELAPSED_MIN=$(( ELAPSED / 60 )) +echo "⏱️ Elapsed: ${ELAPSED_MIN} minutes" +if [ "$ELAPSED_MIN" -ge 35 ]; then + echo "⚠️ TIME CRITICAL: Skip to PR creation immediately" +fi +if [ "$ELAPSED_MIN" -ge 43 ]; then + echo "🛑 HARD STOP: Call safe output NOW" +fi +``` + - `>= 35 min` → Stop generating, commit what you have, create PR immediately - `>= 43 min` → STOP ALL WORK, call safe output immediately @@ -237,32 +252,42 @@ Example 3: Party Behavior Analysis ## Step 2: Gather Parliamentary Data +⚠️ **CRITICAL: Call each MCP tool AT MOST ONCE. NEVER re-query data.** Save results to variables and reuse them. + Replace `` with today's `YYYY-MM-DD`, `` with the calculated riksmöte value, and `` with the lookback start date. **Saturday** (weekly wrap-up, 5-day lookback): ``` -get_calendar_events({ from: "", tom: "", limit: 100 }) -search_voteringar({ rm: "", limit: 100 }) -get_betankanden({ rm: "", limit: 50 }) -search_anforanden({ rm: "", limit: 100 }) -search_regering({ dateFrom: "", dateTo: "", limit: 50 }) -get_propositioner({ rm: "", limit: 20 }) -get_motioner({ rm: "", limit: 50 }) -get_fragor({ rm: "", limit: 50 }) -get_interpellationer({ rm: "", limit: 20 }) -get_calendar_events({ from: "", tom: "", limit: 50 }) +get_calendar_events({ from: "", tom: "", limit: 30 }) +search_voteringar({ rm: "", limit: 20 }) +get_betankanden({ rm: "", limit: 15 }) +search_anforanden({ rm: "", limit: 20 }) +search_regering({ dateFrom: "", dateTo: "", limit: 20 }) +get_propositioner({ rm: "", limit: 10 }) +get_motioner({ rm: "", limit: 15 }) +get_fragor({ rm: "", limit: 15 }) +get_interpellationer({ rm: "", limit: 10 }) +get_calendar_events({ from: "", tom: "", limit: 20 }) ``` **Weekday** (daily, lookback_hours): ``` -get_calendar_events({ from: "", tom: "", limit: 50 }) -search_voteringar({ rm: "", limit: 50 }) -get_betankanden({ rm: "", limit: 20 }) -search_anforanden({ rm: "", limit: 50 }) -search_regering({ dateFrom: "", dateTo: "", limit: 30 }) +get_calendar_events({ from: "", tom: "", limit: 20 }) +search_voteringar({ rm: "", limit: 15 }) +get_betankanden({ rm: "", limit: 10 }) +search_anforanden({ rm: "", limit: 15 }) +search_regering({ dateFrom: "", dateTo: "", limit: 15 }) get_propositioner({ rm: "", limit: 10 }) -get_motioner({ rm: "", limit: 20 }) -get_calendar_events({ from: "", tom: "", limit: 50 }) +get_motioner({ rm: "", limit: 10 }) +get_calendar_events({ from: "", tom: "", limit: 20 }) +``` + +**After gathering data, mark the phase complete:** +```bash +echo "✅ DATA PHASE COMPLETE — DO NOT re-query any MCP tools above" +source /tmp/gh-aw/agent/timing.env +ELAPSED=$(( $(date +%s) - START_TIME )) +echo "⏱️ Elapsed: $(( ELAPSED / 60 )) minutes — proceeding to article generation" ``` **Filter results by date** — many tools don't support date params directly. Filter to `>= fromDate` in analysis. @@ -295,17 +320,29 @@ SCRIPT_EXIT=$? ### Weekday — Manual Evening Analysis +⚠️ **IMPORTANT: Generate EN and SV articles only.** The news-translate workflow handles all other languages. Do NOT attempt to generate 14 language versions — this wastes time and context. + The `evening-analysis` article type is NOT in the script's `VALID_ARTICLE_TYPES` (see `scripts/generate-news-enhanced/config.ts`). Evening analysis requires **analytical synthesis** across multiple data sources which the template-based script cannot provide. Generate articles manually using MCP data gathered in Step 2. -**Process ONE language at a time** (en first, then sv, then remaining): +**Check time before starting:** +```bash +source /tmp/gh-aw/agent/timing.env +ELAPSED=$(( $(date +%s) - START_TIME )) +ELAPSED_MIN=$(( ELAPSED / 60 )) +echo "⏱️ Elapsed: ${ELAPSED_MIN} minutes — starting article generation" +if [ "$ELAPSED_MIN" -ge 35 ]; then + echo "⚠️ TIME CRITICAL: Skip to Step 5 (PR creation)" +fi +``` -For each language in [en, sv, da, no, fi, de, fr, es, nl, ar, he, ja, ko, zh]: +**Process EN first, then SV:** + +For each language in [en, sv]: 1. Check elapsed time — if >= 35 minutes, stop and proceed to Step 5 2. Create `news/YYYY-MM-DD-evening-analysis-{lang}.html` 3. Use `` — NO embedded `