Fourteen agentic workflows use the gh-aw (GitHub Agentic Workflows) framework to generate political-intelligence content following OSINT/INTOP editorial standards and the 23-artifact analysis baseline. The 13 analysis/article-generating workflows run on claude-opus-4.8 (strongest reasoning for the analysis pipeline), while the high-volume news-translate workflow stays on claude-sonnet-4.6 for translation-fan-out throughput.
+
Fourteen agentic workflows use the gh-aw (GitHub Agentic Workflows) framework to generate political-intelligence content following OSINT/INTOP editorial standards and the 23-artifact analysis baseline. The 13 analysis/article-generating workflows run on claude-opus-5 (strongest reasoning for the analysis pipeline), while the high-volume news-translate workflow stays on claude-sonnet-4.6 for translation-fan-out throughput.
classDef pipeline fill:#e1bee7,stroke:#6a1b9a,stroke-width:1.5px,color:black classDef workflow fill:#ce93d8,stroke:#6a1b9a,stroke-width:1px,color:black classDef ai fill:#9C27B0,stroke:#6a1b9a,stroke-width:2px,color:white
class Trigger,PreAnalysis,Download,Generate,QualityCheck,Translate,Deploy pipeline class AIAnalysis ai class W1,W2,W3,W4,W5,W6,W7,W8,W9,W10,W11,W12,W13,W14 workflow
diff --git a/docs/api/media/Article-Generation.md b/docs/api/media/Article-Generation.md
index a2a52e3e919..3df335e9639 100644
--- a/docs/api/media/Article-Generation.md
+++ b/docs/api/media/Article-Generation.md
@@ -165,7 +165,7 @@ It declares:
| **Schedule** | Daily around 07:00 on weekdays |
| **Manual inputs** | `article_date`, `force_generation`, `analysis_depth` (no `languages` input — every run renders all 14). All `workflow_dispatch` inputs are validated and exported to `$GITHUB_ENV` by the [`./.github/actions/news-resolve-inputs`](.github/actions/news-resolve-inputs/action.yml) composite (runs right after `news-prewarm`) so the agent's bash sandbox sees the canonical `ARTICLE_DATE` / `SUBFOLDER` / `ANALYSIS_DEPTH` / `FORCE_GENERATION` variables verbatim via `awf --env-all`. See [`.github/prompts/00-base-contract.md §Runtime input contract`](.github/prompts/00-base-contract.md) for the per-workflow extra-input table (`CYCLE_ANCHOR`, `COVERAGE_DEPTH`, `LOOKBACK_HOURS`, `ARTICLE_TYPES`, `FOCUS`, `LANGUAGES_RESOLVED`, `MAX_BRIEFS_RESOLVED`, `FORCE_RETRANSLATE`, `TRANSLATE_SUBFOLDER`). |
| **Runtime** | Node.js `26` |
-| **Engine** | Copilot with `claude-opus-4.8` (the 13 analysis/article-generating news workflows; `news-translate` keeps `claude-sonnet-4.6` for high-volume translation throughput) |
+| **Engine** | Copilot with `claude-opus-5` (the 13 analysis/article-generating news workflows; `news-translate` keeps `claude-sonnet-4.6` for high-volume translation throughput) |
| **Permissions** | Read-only content/issues/PR/actions/discussions/security-events for AI job |
| **MCP gateway** | Enabled |
| **Safe outputs** | One PR max, labels `agentic-news`, `analysis-data` (no translation dispatch — all 14 languages rendered in-run) |
diff --git a/docs/api/media/README-3.md b/docs/api/media/README-3.md
index 0a125d9c4c2..5ff8b1c0972 100644
--- a/docs/api/media/README-3.md
+++ b/docs/api/media/README-3.md
@@ -109,7 +109,7 @@ Every news workflow declares the **same** tool & runtime surface for parity, res
| Field | Value | Purpose |
|-------|-------|---------|
| `runtimes.node.version` | `"26"` | Pinned Node 26 for IMF CLI + render scripts |
-| `engine.id` / `engine.model` | `copilot` / `claude-opus-4.8` (13 analysis/article workflows); `claude-sonnet-4.6` (`news-translate` only) | Opus reasoning model for the 23-artifact analysis pipeline; the high-volume translation fan-out keeps the faster Sonnet model. (Sonnet was the repo-wide baseline through v0.74.3; GPT-5.4 / GPT-5.4-mini eligibility resolved upstream per release notes #31695 + #32197 but not yet A/B-tested here.) |
+| `engine.id` / `engine.model` | `copilot` / `claude-opus-5` (13 analysis/article workflows); `claude-sonnet-4.6` (`news-translate` only) | Opus reasoning model for the 23-artifact analysis pipeline; the high-volume translation fan-out keeps the faster Sonnet model. (Sonnet was the repo-wide baseline through v0.74.3; GPT-5.4 / GPT-5.4-mini eligibility resolved upstream per release notes #31695 + #32197 but not yet A/B-tested here.) |
| `engine.mcp.session-timeout` | ~~`1h`~~ **removed** | Was added in gh-aw v0.71.3 and rejected by MCP Gateway v0.3.1. v0.74.3 lock files now ship MCP Gateway v0.3.9; re-acceptance has not yet been validated on this repo, so the field stays removed until verified. |
| `tools.github.toolsets` | `[all]` | Full GitHub MCP surface (issues, PRs, repos, code-search, actions, releases, discussions, …); see [`github-tools.md`](https://github.com/github/gh-aw/blob/main/docs/src/content/docs/reference/github-tools.md) |
| `tools.bash` / `tools.edit` / `tools.web-fetch` / `tools.agentic-workflows` | enabled | Full local tool surface; `web-fetch` reaches non-MCP public sources (`statskontoret.se`, `riksdagsmonitor.com`) through the AWF firewall |
diff --git a/docs/test-results/vitest-results.json b/docs/test-results/vitest-results.json
index d5f89ca6f1c..31a88fe3610 100644
--- a/docs/test-results/vitest-results.json
+++ b/docs/test-results/vitest-results.json
@@ -1 +1 @@
-{"numTotalTestSuites":1615,"numPassedTestSuites":1615,"numFailedTestSuites":0,"numPendingTestSuites":0,"numTotalTests":7605,"numPassedTests":7571,"numFailedTests":0,"numPendingTests":34,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1787953656920,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface the safety doc itself exists and is the only allowlisted source of pattern strings","status":"passed","title":"the safety doc itself exists and is the only allowlisted source of pattern strings","duration":4.229150000000004,"failureMessages":[],"location":{"line":255,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-committee-reports.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-committee-reports.md contains no banned bash patterns in fenced code blocks","duration":1.7056140000000255,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-election-cycle.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-election-cycle.md contains no banned bash patterns in fenced code blocks","duration":0.7225730000000112,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-evening-analysis.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-evening-analysis.md contains no banned bash patterns in fenced code blocks","duration":0.6791809999999714,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-interpellations.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-interpellations.md contains no banned bash patterns in fenced code blocks","duration":0.5793239999999855,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-month-ahead.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-month-ahead.md contains no banned bash patterns in fenced code blocks","duration":0.5301330000000348,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-monthly-review.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-monthly-review.md contains no banned bash patterns in fenced code blocks","duration":0.5585149999999999,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-motions.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-motions.md contains no banned bash patterns in fenced code blocks","duration":0.49733200000002853,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-propositions.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-propositions.md contains no banned bash patterns in fenced code blocks","duration":0.6525220000000331,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-quarter-ahead.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-quarter-ahead.md contains no banned bash patterns in fenced code blocks","duration":0.5025210000000015,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-realtime-monitor.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-realtime-monitor.md contains no banned bash patterns in fenced code blocks","duration":0.567924000000005,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-translate.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-translate.md contains no banned bash patterns in fenced code blocks","duration":0.5972489999999766,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-week-ahead.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-week-ahead.md contains no banned bash patterns in fenced code blocks","duration":0.4668350000000032,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-weekly-review.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-weekly-review.md contains no banned bash patterns in fenced code blocks","duration":0.46835699999996905,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/workflows/news-year-ahead.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/workflows/news-year-ahead.md contains no banned bash patterns in fenced code blocks","duration":0.44745799999998326,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/00-base-contract.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/00-base-contract.md contains no banned bash patterns in fenced code blocks","duration":1.2079709999999864,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/02-mcp-access.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/02-mcp-access.md contains no banned bash patterns in fenced code blocks","duration":0.6259320000000343,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/03-data-download.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/03-data-download.md contains no banned bash patterns in fenced code blocks","duration":1.2184520000000134,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/04-analysis-pipeline.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/04-analysis-pipeline.md contains no banned bash patterns in fenced code blocks","duration":0.6528119999999831,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/05-analysis-gate.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/05-analysis-gate.md contains no banned bash patterns in fenced code blocks","duration":2.420812999999953,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/06-article-generation.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/06-article-generation.md contains no banned bash patterns in fenced code blocks","duration":1.0866750000000138,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/07-commit-and-pr.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/07-commit-and-pr.md contains no banned bash patterns in fenced code blocks","duration":1.0482330000000388,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/README.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/README.md contains no banned bash patterns in fenced code blocks","duration":0.7051500000000033,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/prompts/seo-metadata-contract.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/prompts/seo-metadata-contract.md contains no banned bash patterns in fenced code blocks","duration":0.6248499999999808,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/advanced-data-visualization/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/advanced-data-visualization/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.5267370000000255,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/agentic-workflows/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/agentic-workflows/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.5621719999999755,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/ai-governance/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/ai-governance/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6534440000000359,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/api-integration/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/api-integration/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6589239999999563,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/automated-content-generation/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/automated-content-generation/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.5915479999999889,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/behavioral-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/behavioral-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.9244419999999991,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/business-development/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/business-development/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.869117000000017,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/business-model-canvas/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/business-model-canvas/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.7162910000000124,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/c4-architecture-documentation/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/c4-architecture-documentation/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.7536510000000476,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/change-management/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/change-management/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.67897099999999,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/ci-cd-security/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/ci-cd-security/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.636743000000024,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/cia-data-integration/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/cia-data-integration/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6531130000000189,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/cis-controls/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/cis-controls/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.7748920000000226,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/code-quality-checks/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/code-quality-checks/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6438160000000153,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/code-review-practices/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/code-review-practices/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6387860000000387,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/comparative-politics-reporting/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/comparative-politics-reporting/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8401339999999777,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/compliance-checklist/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/compliance-checklist/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.9732319999999959,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/contribution-guidelines/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/contribution-guidelines/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.7038080000000377,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/copilot-agent-patterns/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/copilot-agent-patterns/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6644139999999652,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/data-pipeline-engineering/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/data-pipeline-engineering/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.7263409999999908,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/data-protection/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/data-protection/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8212280000000192,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/data-science-for-intelligence/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/data-science-for-intelligence/SKILL.md contains no banned bash patterns in fenced code blocks","duration":4.007734999999968,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/data-visualization-principles/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/data-visualization-principles/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6225650000000087,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/design-system-management/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/design-system-management/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.5822299999999814,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/documentation-portfolio/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/documentation-portfolio/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6393080000000282,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/documentation-standards/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/documentation-standards/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6205319999999688,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/economic-policy-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/economic-policy-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.7019050000000107,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/editorial-standards/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/editorial-standards/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6770970000000034,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/electoral-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/electoral-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.7847300000000246,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/european-parliament-api/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/european-parliament-api/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.5985610000000179,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gdpr-compliance/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gdpr-compliance/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.6492749999999887,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-authentication-credentials/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-authentication-credentials/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8699290000000133,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-containerization/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-containerization/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8708409999999844,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-continuous-ai-patterns/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-continuous-ai-patterns/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.9371649999999931,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-firewall/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-firewall/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.1155799999999658,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-github-actions-integration/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-github-actions-integration/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.1723049999999944,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-logging-monitoring/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-logging-monitoring/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.9354220000000169,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-mcp-configuration/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-mcp-configuration/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.1180329999999685,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-mcp-gateway/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-mcp-gateway/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.507474000000002,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-safe-outputs/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-safe-outputs/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8753389999999968,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-security-architecture/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-security-architecture/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.218691999999976,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-tools-ecosystem/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-tools-ecosystem/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.0211330000000203,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/gh-aw-workflow-authoring/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/gh-aw-workflow-authoring/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.0575410000000147,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/github-actions-workflows/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/github-actions-workflows/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8017320000000154,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/github-agentic-workflows/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/github-agentic-workflows/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.4229050000000143,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/global-government-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/global-government-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.853398000000027,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/hack23-future-architecture-standards/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/hack23-future-architecture-standards/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.4127960000000144,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/hack23-isms-compliance/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/hack23-isms-compliance/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.9560299999999984,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/html-accessibility/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/html-accessibility/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.9073700000000144,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/incident-response/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/incident-response/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8746380000000045,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/information-security-strategy/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/information-security-strategy/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.8829840000000218,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/input-validation/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/input-validation/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.9019490000000019,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/intelligence-analysis-techniques/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/intelligence-analysis-techniques/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.1421589999999924,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/investigative-journalism/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/investigative-journalism/SKILL.md contains no banned bash patterns in fenced code blocks","duration":0.969244999999944,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/iso-27001-controls/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/iso-27001-controls/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.0953210000000126,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/issue-management/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/issue-management/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.2023619999999937,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/language-expertise/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/language-expertise/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.1178330000000187,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/legislative-monitoring/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/legislative-monitoring/SKILL.md contains no banned bash patterns in fenced code blocks","duration":2.563431000000037,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/marketing/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/marketing/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.9252749999999423,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/mcp-gateway-configuration/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/mcp-gateway-configuration/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.5888349999999036,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/mcp-gateway-security/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/mcp-gateway-security/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.2853569999999763,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/mcp-server-development/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/mcp-server-development/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.139242999999965,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/multi-language-localization/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/multi-language-localization/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.203873999999928,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/myndigheter-monitoring/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/myndigheter-monitoring/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.2088940000001003,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/nist-csf-mapping/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/nist-csf-mapping/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.148800999999935,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/open-source-governance/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/open-source-governance/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.186001000000033,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/osint-methodologies/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/osint-methodologies/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.2982110000000375,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/performance-optimization/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/performance-optimization/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.2048269999999093,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/playwright-testing/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/playwright-testing/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.2482969999999796,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/political-data-visualization/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/political-data-visualization/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.3226359999999886,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/political-science-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/political-science-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.4144679999999425,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/product-management-patterns/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/product-management-patterns/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.2724319999999807,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/prospective-news-coverage/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/prospective-news-coverage/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.3396189999999706,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/regulatory-affairs/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/regulatory-affairs/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.9861590000000433,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/responsive-design/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/responsive-design/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.8174129999999877,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/riksdag-regering-mcp/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/riksdag-regering-mcp/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.996609000000035,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/risk-assessment-frameworks/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/risk-assessment-frameworks/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.9838449999999739,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/secrets-management/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/secrets-management/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.7709760000000188,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/secure-code-review/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/secure-code-review/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.935944999999947,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/secure-development-lifecycle/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/secure-development-lifecycle/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.7451579999999467,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/secure-development-policy/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/secure-development-policy/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.5365880000000516,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/security-by-design/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/security-by-design/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.5589599999999564,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/security-documentation/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/security-documentation/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.5178319999999985,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/seo-best-practices/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/seo-best-practices/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.5242739999999912,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/seo-optimization/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/seo-optimization/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.5541109999999208,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/static-site-security/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/static-site-security/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.7893909999999096,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/strategic-communication-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/strategic-communication-analysis/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.7121559999999363,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/swedish-political-system/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/swedish-political-system/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.71358900000007,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/testing-strategy/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/testing-strategy/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.614663999999948,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/threat-modeling/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/threat-modeling/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.7588739999999916,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/ui-ux-design/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/ui-ux-design/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.7814560000000483,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Banned bash patterns are absent from agent-visible prompt surface"],"fullName":"Agentic Workflow Bash & Shell Safety Banned bash patterns are absent from agent-visible prompt surface .github/skills/vulnerability-management/SKILL.md contains no banned bash patterns in fenced code blocks","status":"passed","title":".github/skills/vulnerability-management/SKILL.md contains no banned bash patterns in fenced code blocks","duration":1.9136140000000523,"failureMessages":[],"location":{"line":270,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Allowed eval replacements are documented and self-consistent"],"fullName":"Agentic Workflow Bash & Shell Safety Allowed eval replacements are documented and self-consistent safety doc still names the three allowed eval replacements","status":"passed","title":"safety doc still names the three allowed eval replacements","duration":2.643269999999916,"failureMessages":[],"location":{"line":285,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow Bash & Shell Safety","Allowed eval replacements are documented and self-consistent"],"fullName":"Agentic Workflow Bash & Shell Safety Allowed eval replacements are documented and self-consistent no agent-visible file authorises a fourth eval-replacement shape","status":"passed","title":"no agent-visible file authorises a fourth eval-replacement shape","duration":16.867084999999975,"failureMessages":[],"location":{"line":299,"column":5},"meta":{},"tags":[]}],"startTime":1787953807235,"endTime":1787953807385.8672,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/agentic-workflow-bash-safety.test.ts"},{"assertionResults":[{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Data Freshness Validation"],"fullName":"Agentic Workflow MCP Query Patterns Data Freshness Validation news-evening-analysis.md should document get_sync_status() call","status":"passed","title":"news-evening-analysis.md should document get_sync_status() call","duration":7.120672000000013,"failureMessages":[],"location":{"line":46,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Data Freshness Validation"],"fullName":"Agentic Workflow MCP Query Patterns Data Freshness Validation news-evening-analysis.md should warn about stale data","status":"passed","title":"news-evening-analysis.md should warn about stale data","duration":1.7746319999999969,"failureMessages":[],"location":{"line":58,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Data Freshness Validation"],"fullName":"Agentic Workflow MCP Query Patterns Data Freshness Validation news-realtime-monitor.md should document get_sync_status() call","status":"passed","title":"news-realtime-monitor.md should document get_sync_status() call","duration":2.2326400000000035,"failureMessages":[],"location":{"line":46,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Data Freshness Validation"],"fullName":"Agentic Workflow MCP Query Patterns Data Freshness Validation news-realtime-monitor.md should warn about stale data","status":"passed","title":"news-realtime-monitor.md should warn about stale data","duration":1.4788990000000126,"failureMessages":[],"location":{"line":58,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Explicit Date Filtering"],"fullName":"Agentic Workflow MCP Query Patterns Explicit Date Filtering news-evening-analysis.md should document explicit date parameters","status":"passed","title":"news-evening-analysis.md should document explicit date parameters","duration":2.585050000000024,"failureMessages":[],"location":{"line":81,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Explicit Date Filtering"],"fullName":"Agentic Workflow MCP Query Patterns Explicit Date Filtering news-evening-analysis.md should NOT rely on implicit \"latest\" patterns","status":"passed","title":"news-evening-analysis.md should NOT rely on implicit \"latest\" patterns","duration":2.472578999999996,"failureMessages":[],"location":{"line":98,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Explicit Date Filtering"],"fullName":"Agentic Workflow MCP Query Patterns Explicit Date Filtering news-realtime-monitor.md should document explicit date parameters","status":"passed","title":"news-realtime-monitor.md should document explicit date parameters","duration":2.273285000000044,"failureMessages":[],"location":{"line":81,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Explicit Date Filtering"],"fullName":"Agentic Workflow MCP Query Patterns Explicit Date Filtering news-realtime-monitor.md should NOT rely on implicit \"latest\" patterns","status":"passed","title":"news-realtime-monitor.md should NOT rely on implicit \"latest\" patterns","duration":1.9193729999999505,"failureMessages":[],"location":{"line":98,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Post-Query Date Filtering Documentation"],"fullName":"Agentic Workflow MCP Query Patterns Post-Query Date Filtering Documentation news-evening-analysis.md should document post-query filtering","status":"passed","title":"news-evening-analysis.md should document post-query filtering","duration":2.043274999999994,"failureMessages":[],"location":{"line":144,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Post-Query Date Filtering Documentation"],"fullName":"Agentic Workflow MCP Query Patterns Post-Query Date Filtering Documentation workflows should annotate tools with date support","status":"passed","title":"workflows should annotate tools with date support","duration":2.008100000000013,"failureMessages":[],"location":{"line":164,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Post-Query Date Filtering Documentation"],"fullName":"Agentic Workflow MCP Query Patterns Post-Query Date Filtering Documentation news-evening-analysis.md should document post-query fromDate filtering guidance","status":"passed","title":"news-evening-analysis.md should document post-query fromDate filtering guidance","duration":1.8616549999999847,"failureMessages":[],"location":{"line":181,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Cross-Referencing Strategy"],"fullName":"Agentic Workflow MCP Query Patterns Cross-Referencing Strategy news-evening-analysis.md should document cross-referencing of data sources","status":"passed","title":"news-evening-analysis.md should document cross-referencing of data sources","duration":3.5262420000000247,"failureMessages":[],"location":{"line":193,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Error Handling"],"fullName":"Agentic Workflow MCP Query Patterns Error Handling news-evening-analysis.md should document error scenarios","status":"passed","title":"news-evening-analysis.md should document error scenarios","duration":1.2753979999999956,"failureMessages":[],"location":{"line":219,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Error Handling"],"fullName":"Agentic Workflow MCP Query Patterns Error Handling news-evening-analysis.md should document stale/partial data handling","status":"passed","title":"news-evening-analysis.md should document stale/partial data handling","duration":1.6391489999999749,"failureMessages":[],"location":{"line":241,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Error Handling"],"fullName":"Agentic Workflow MCP Query Patterns Error Handling news-realtime-monitor.md should document error scenarios","status":"passed","title":"news-realtime-monitor.md should document error scenarios","duration":1.134333999999967,"failureMessages":[],"location":{"line":219,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Error Handling"],"fullName":"Agentic Workflow MCP Query Patterns Error Handling news-realtime-monitor.md should document stale/partial data handling","status":"passed","title":"news-realtime-monitor.md should document stale/partial data handling","duration":1.5181820000000243,"failureMessages":[],"location":{"line":241,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","MCP Tool Documentation Quality"],"fullName":"Agentic Workflow MCP Query Patterns MCP Tool Documentation Quality news-evening-analysis.md should document the MCP surface inline or via prompt modules","status":"passed","title":"news-evening-analysis.md should document the MCP surface inline or via prompt modules","duration":1.2584959999999796,"failureMessages":[],"location":{"line":263,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","MCP Tool Documentation Quality"],"fullName":"Agentic Workflow MCP Query Patterns MCP Tool Documentation Quality news-evening-analysis.md should emphasize get_sync_status() first","status":"passed","title":"news-evening-analysis.md should emphasize get_sync_status() first","duration":1.1235940000000255,"failureMessages":[],"location":{"line":294,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","MCP Tool Documentation Quality"],"fullName":"Agentic Workflow MCP Query Patterns MCP Tool Documentation Quality news-realtime-monitor.md should document the MCP surface inline or via prompt modules","status":"passed","title":"news-realtime-monitor.md should document the MCP surface inline or via prompt modules","duration":1.1142059999999674,"failureMessages":[],"location":{"line":263,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","MCP Tool Documentation Quality"],"fullName":"Agentic Workflow MCP Query Patterns MCP Tool Documentation Quality news-realtime-monitor.md should emphasize get_sync_status() first","status":"passed","title":"news-realtime-monitor.md should emphasize get_sync_status() first","duration":1.4319710000000327,"failureMessages":[],"location":{"line":294,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Date Filtering Best Practices"],"fullName":"Agentic Workflow MCP Query Patterns Date Filtering Best Practices workflows should have date calculation examples","status":"passed","title":"workflows should have date calculation examples","duration":1.6785320000000183,"failureMessages":[],"location":{"line":315,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Date Filtering Best Practices"],"fullName":"Agentic Workflow MCP Query Patterns Date Filtering Best Practices workflows should include dynamic riksmöte calculation instructions","status":"passed","title":"workflows should include dynamic riksmöte calculation instructions","duration":1.6541070000000104,"failureMessages":[],"location":{"line":328,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Date Filtering Best Practices"],"fullName":"Agentic Workflow MCP Query Patterns Date Filtering Best Practices all news workflows should not hardcode the parliamentary session year","status":"passed","title":"all news workflows should not hardcode the parliamentary session year","duration":9.407573000000014,"failureMessages":[],"location":{"line":338,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Workflow Compilation"],"fullName":"Agentic Workflow MCP Query Patterns Workflow Compilation news-evening-analysis.md should compile without errors","status":"passed","title":"news-evening-analysis.md should compile without errors","duration":2.018429000000026,"failureMessages":[],"location":{"line":360,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Workflow Compilation"],"fullName":"Agentic Workflow MCP Query Patterns Workflow Compilation news-realtime-monitor.md should compile without errors","status":"passed","title":"news-realtime-monitor.md should compile without errors","duration":3.7051969999999983,"failureMessages":[],"location":{"line":360,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Regression Prevention"],"fullName":"Agentic Workflow MCP Query Patterns Regression Prevention evening analysis should maintain enhanced query patterns","status":"passed","title":"evening analysis should maintain enhanced query patterns","duration":1.197170999999969,"failureMessages":[],"location":{"line":386,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Agentic Workflow MCP Query Patterns","Regression Prevention"],"fullName":"Agentic Workflow MCP Query Patterns Regression Prevention workflows should not use ambiguous \"latest\" language","status":"passed","title":"workflows should not use ambiguous \"latest\" language","duration":1.4189360000000306,"failureMessages":[],"location":{"line":408,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Tool Date Parameter Support Matrix"],"fullName":"MCP Tool Date Parameter Support Matrix effective prompt for evening analysis should scope MCP queries by date","status":"passed","title":"effective prompt for evening analysis should scope MCP queries by date","duration":1.0432839999999715,"failureMessages":[],"location":{"line":463,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-committee-reports.md should import the MCP access prompt module","status":"passed","title":"news-committee-reports.md should import the MCP access prompt module","duration":0.5726119999999923,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-committee-reports.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-committee-reports.md should not embed inline python3 JSON-parsing scripts","duration":1.309020999999973,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-evening-analysis.md should import the MCP access prompt module","status":"passed","title":"news-evening-analysis.md should import the MCP access prompt module","duration":0.678910999999971,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-evening-analysis.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-evening-analysis.md should not embed inline python3 JSON-parsing scripts","duration":0.9703460000000064,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-interpellations.md should import the MCP access prompt module","status":"passed","title":"news-interpellations.md should import the MCP access prompt module","duration":0.47906699999998636,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-interpellations.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-interpellations.md should not embed inline python3 JSON-parsing scripts","duration":0.556822000000011,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-month-ahead.md should import the MCP access prompt module","status":"passed","title":"news-month-ahead.md should import the MCP access prompt module","duration":0.47168299999998453,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-month-ahead.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-month-ahead.md should not embed inline python3 JSON-parsing scripts","duration":0.5634660000000054,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-monthly-review.md should import the MCP access prompt module","status":"passed","title":"news-monthly-review.md should import the MCP access prompt module","duration":0.4721139999999764,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-monthly-review.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-monthly-review.md should not embed inline python3 JSON-parsing scripts","duration":0.6159139999999752,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-motions.md should import the MCP access prompt module","status":"passed","title":"news-motions.md should import the MCP access prompt module","duration":0.4916210000000092,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-motions.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-motions.md should not embed inline python3 JSON-parsing scripts","duration":0.5864879999999744,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-propositions.md should import the MCP access prompt module","status":"passed","title":"news-propositions.md should import the MCP access prompt module","duration":0.493344000000036,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-propositions.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-propositions.md should not embed inline python3 JSON-parsing scripts","duration":0.6698440000000119,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-realtime-monitor.md should import the MCP access prompt module","status":"passed","title":"news-realtime-monitor.md should import the MCP access prompt module","duration":0.5894729999999981,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-realtime-monitor.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-realtime-monitor.md should not embed inline python3 JSON-parsing scripts","duration":0.5937910000000102,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-week-ahead.md should import the MCP access prompt module","status":"passed","title":"news-week-ahead.md should import the MCP access prompt module","duration":0.5471949999999879,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-week-ahead.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-week-ahead.md should not embed inline python3 JSON-parsing scripts","duration":0.6167639999999892,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-weekly-review.md should import the MCP access prompt module","status":"passed","title":"news-weekly-review.md should import the MCP access prompt module","duration":0.675423999999964,"failureMessages":[],"location":{"line":522,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards news-weekly-review.md should not embed inline python3 JSON-parsing scripts","status":"passed","title":"news-weekly-review.md should not embed inline python3 JSON-parsing scripts","duration":0.6459300000000212,"failureMessages":[],"location":{"line":529,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["MCP Prompt-Module Anti-Pattern Guards"],"fullName":"MCP Prompt-Module Anti-Pattern Guards prompts/02-mcp-access.md should define the canonical MCP access contract","status":"passed","title":"prompts/02-mcp-access.md should define the canonical MCP access contract","duration":0.7086570000000165,"failureMessages":[],"location":{"line":548,"column":3},"meta":{},"tags":[]}],"startTime":1787953667246,"endTime":1787953667324.7087,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/agentic-workflow-mcp-queries.test.ts"},{"assertionResults":[{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation renders a localised navigation table with one row per available artifact + audit appendix","status":"passed","title":"renders a localised navigation table with one row per available artifact + audit appendix","duration":6.4800840000000335,"failureMessages":[],"location":{"line":19,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation localises the heading per language (sv)","status":"passed","title":"localises the heading per language (sv)","duration":0.6548860000000332,"failureMessages":[],"location":{"line":50,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation omits per-document row when no documents/*-analysis.md artifacts present","status":"passed","title":"omits per-document row when no documents/*-analysis.md artifacts present","duration":0.5446100000000342,"failureMessages":[],"location":{"line":58,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation includes per-document row when documents/*-analysis.md present","status":"passed","title":"includes per-document row when documents/*-analysis.md present","duration":0.6226659999999811,"failureMessages":[],"location":{"line":66,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation always includes the audit-appendix row even when no curated artifacts matched","status":"passed","title":"always includes the audit-appendix row even when no curated artifacts matched","duration":0.5295810000000074,"failureMessages":[],"location":{"line":74,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation points the audit row at political-classification when that is the available audit artifact","status":"passed","title":"points the audit row at political-classification when that is the available audit artifact","duration":0.7306180000000495,"failureMessages":[],"location":{"line":87,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation renders rows for ALL analysis artifacts, not just the curated lenses","status":"passed","title":"renders rows for ALL analysis artifacts, not just the curated lenses","duration":0.9459410000000616,"failureMessages":[],"location":{"line":96,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation uses the localised colIcon header for the icon column (not hard-coded English \"Icon\")","status":"passed","title":"uses the localised colIcon header for the icon column (not hard-coded English \"Icon\")","duration":0.7366389999999683,"failureMessages":[],"location":{"line":124,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation skips JSON artifacts and unknown extensions (no broken in-page anchors)","status":"passed","title":"skips JSON artifacts and unknown extensions (no broken in-page anchors)","duration":0.6240179999999782,"failureMessages":[],"location":{"line":136,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation de-duplicates filename-variant alias groups (election-2026-analysis vs election-cycle-analysis)","status":"passed","title":"de-duplicates filename-variant alias groups (election-2026-analysis vs election-cycle-analysis)","duration":0.7651019999999562,"failureMessages":[],"location":{"line":157,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderReaderNavigation"],"fullName":"article-aside — renderReaderNavigation skips README.md and article*.md aggregator outputs","status":"passed","title":"skips README.md and article*.md aggregator outputs","duration":0.6531739999999218,"failureMessages":[],"location":{"line":177,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderAnalysisArtifactsReference"],"fullName":"article-aside — renderAnalysisArtifactsReference returns the empty string when no artifacts supplied","status":"passed","title":"returns the empty string when no artifacts supplied","duration":0.4747989999999618,"failureMessages":[],"location":{"line":188,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderAnalysisArtifactsReference"],"fullName":"article-aside — renderAnalysisArtifactsReference renders one source card per artifact with icon, i18n title, and GitHub blob url","status":"passed","title":"renders one source card per artifact with icon, i18n title, and GitHub blob url","duration":0.7371799999999666,"failureMessages":[],"location":{"line":198,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderMethodsReference"],"fullName":"article-aside — renderMethodsReference renders the four methodology cards plus a CTA back to political-intelligence","status":"passed","title":"renders the four methodology cards plus a CTA back to political-intelligence","duration":0.6880690000000413,"failureMessages":[],"location":{"line":224,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-aside — renderMethodsReference"],"fullName":"article-aside — renderMethodsReference points the CTA to the language-specific catalogue page (sv)","status":"passed","title":"points the CTA to the language-specific catalogue page (sv)","duration":0.40649100000007365,"failureMessages":[],"location":{"line":240,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article — analysis-artifacts → methods ordering at the article foot"],"fullName":"article — analysis-artifacts → methods ordering at the article foot renders rm-article-sources strictly BEFORE rm-methods-reference","status":"passed","title":"renders rm-article-sources strictly BEFORE rm-methods-reference","duration":49.441985000000045,"failureMessages":[],"location":{"line":268,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article — analysis-artifacts → methods ordering at the article foot"],"fullName":"article — analysis-artifacts → methods ordering at the article foot renders the navigation table BEFORE the analysis-artifacts reference","status":"passed","title":"renders the navigation table BEFORE the analysis-artifacts reference","duration":5.55018199999995,"failureMessages":[],"location":{"line":284,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article — analysis-artifacts → methods ordering at the article foot"],"fullName":"article — analysis-artifacts → methods ordering at the article foot renders the methods reference for all 14 languages","status":"passed","title":"renders the methods reference for all 14 languages","duration":44.41408100000001,"failureMessages":[],"location":{"line":298,"column":3},"meta":{},"tags":[]}],"startTime":1787953793416,"endTime":1787953793531.414,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-aside.test.ts"},{"assertionResults":[{"ancestorTitles":["stripEmbeddedLocalizedBriefSections"],"fullName":"stripEmbeddedLocalizedBriefSections removes every embedded carrier section while keeping analytical sections","status":"passed","title":"removes every embedded carrier section while keeping analytical sections","duration":4.398975999999948,"failureMessages":[],"location":{"line":69,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripEmbeddedLocalizedBriefSections"],"fullName":"stripEmbeddedLocalizedBriefSections collapses the blank-line gap left by removed carriers and ends with a single newline","status":"passed","title":"collapses the blank-line gap left by removed carriers and ends with a single newline","duration":0.7116829999999936,"failureMessages":[],"location":{"line":80,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripEmbeddedLocalizedBriefSections"],"fullName":"stripEmbeddedLocalizedBriefSections is a no-op for a body with no carrier sections","status":"passed","title":"is a no-op for a body with no carrier sections","duration":0.7009620000000041,"failureMessages":[],"location":{"line":87,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripEmbeddedLocalizedBriefSections"],"fullName":"stripEmbeddedLocalizedBriefSections strips a stray `## Executive Brief En` carrier (executive-brief_en.md) so it never leaks into the TOC","status":"passed","title":"strips a stray `## Executive Brief En` carrier (executive-brief_en.md) so it never leaks into the TOC","duration":0.555940000000021,"failureMessages":[],"location":{"line":93,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripEmbeddedLocalizedBriefSections"],"fullName":"stripEmbeddedLocalizedBriefSections preserves the legacy unsuffixed `## Executive Brief` lead heading (no language suffix)","status":"passed","title":"preserves the legacy unsuffixed `## Executive Brief` lead heading (no language suffix)","duration":0.46960999999998876,"failureMessages":[],"location":{"line":120,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead English: strips carriers but keeps the canonical English lead verbatim","status":"passed","title":"English: strips carriers but keeps the canonical English lead verbatim","duration":0.549018999999987,"failureMessages":[],"location":{"line":130,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead English: also strips a stray `## Executive Brief En` carrier while keeping the canonical lead","status":"passed","title":"English: also strips a stray `## Executive Brief En` carrier while keeping the canonical lead","duration":0.5395300000000134,"failureMessages":[],"location":{"line":142,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead non-English with a brief: swaps the lead body to localized prose under the stable H2","status":"passed","title":"non-English with a brief: swaps the lead body to localized prose under the stable H2","duration":14.320760000000007,"failureMessages":[],"location":{"line":172,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead non-English brief: cleaning strips front-matter and the first H1, demotes ## to ###","status":"passed","title":"non-English brief: cleaning strips front-matter and the first H1, demotes ## to ###","duration":0.9329270000000065,"failureMessages":[],"location":{"line":190,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead non-English brief: repoints the lead provenance comment at executive-brief_.md","status":"passed","title":"non-English brief: repoints the lead provenance comment at executive-brief_.md","duration":0.6263529999999946,"failureMessages":[],"location":{"line":204,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead non-English without a brief: keeps the English lead (localized-if-exists, English-otherwise)","status":"passed","title":"non-English without a brief: keeps the English lead (localized-if-exists, English-otherwise)","duration":0.4694390000000226,"failureMessages":[],"location":{"line":215,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead non-English with an empty/whitespace brief: falls back to the English lead","status":"passed","title":"non-English with an empty/whitespace brief: falls back to the English lead","duration":0.36242899999996325,"failureMessages":[],"location":{"line":226,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead does not inject English normalize-terminology glosses into localized prose","status":"passed","title":"does not inject English normalize-terminology glosses into localized prose","duration":0.5103659999999763,"failureMessages":[],"location":{"line":236,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead targets the first H2 generically (legacy `## Executive Brief` lead heading)","status":"passed","title":"targets the first H2 generically (legacy `## Executive Brief` lead heading)","duration":0.5483969999999658,"failureMessages":[],"location":{"line":247,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["localizeExecutiveBriefLead"],"fullName":"localizeExecutiveBriefLead handles a lead section that is the only H2 (no trailing analytical section)","status":"passed","title":"handles a lead section that is the only H2 (no trailing analytical section)","duration":0.5438490000000229,"failureMessages":[],"location":{"line":270,"column":3},"meta":{},"tags":[]}],"startTime":1787953826389,"endTime":1787953826416.544,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-brief-lead.test.ts"},{"assertionResults":[{"ancestorTitles":["computeArticleHeadMetadata"],"fullName":"computeArticleHeadMetadata returns the raw front-matter values verbatim","status":"passed","title":"returns the raw front-matter values verbatim","duration":11.22403300000002,"failureMessages":[],"location":{"line":41,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata"],"fullName":"computeArticleHeadMetadata parses the front-matter date into YYYY-MM-DD","status":"passed","title":"parses the front-matter date into YYYY-MM-DD","duration":0.861233000000027,"failureMessages":[],"location":{"line":56,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata"],"fullName":"computeArticleHeadMetadata infers the article type from the canonical path (committee-reports)","status":"passed","title":"infers the article type from the canonical path (committee-reports)","duration":0.8138739999999984,"failureMessages":[],"location":{"line":65,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata"],"fullName":"computeArticleHeadMetadata produces a branded with brand suffix and NO date prefix","status":"passed","title":"produces a branded with brand suffix and NO date prefix","duration":1.1119619999999486,"failureMessages":[],"location":{"line":75,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata"],"fullName":"computeArticleHeadMetadata forwards keywords / description into the buildArticleSeoMetadata output","status":"passed","title":"forwards keywords / description into the buildArticleSeoMetadata output","duration":0.7065230000000042,"failureMessages":[],"location":{"line":92,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata"],"fullName":"computeArticleHeadMetadata falls back to \"today\" when the front-matter date is missing","status":"passed","title":"falls back to \"today\" when the front-matter date is missing","duration":1.021532000000036,"failureMessages":[],"location":{"line":103,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata"],"fullName":"computeArticleHeadMetadata exposes articleSection matching the value buildChrome passes to article:section","status":"passed","title":"exposes articleSection matching the value buildChrome passes to article:section","duration":0.6365509999999972,"failureMessages":[],"location":{"line":121,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseFrontMatterDate (re-exported)"],"fullName":"parseFrontMatterDate (re-exported) accepts an ISO Date instance","status":"passed","title":"accepts an ISO Date instance","duration":0.5125499999999761,"failureMessages":[],"location":{"line":136,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseFrontMatterDate (re-exported)"],"fullName":"parseFrontMatterDate (re-exported) accepts a YYYY-MM-DD string","status":"passed","title":"accepts a YYYY-MM-DD string","duration":0.48171100000001843,"failureMessages":[],"location":{"line":140,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseFrontMatterDate (re-exported)"],"fullName":"parseFrontMatterDate (re-exported) falls back to the injected \"now\" when the input is missing","status":"passed","title":"falls back to the injected \"now\" when the input is missing","duration":0.4928530000000251,"failureMessages":[],"location":{"line":144,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["inferArticleType (re-exported)"],"fullName":"inferArticleType (re-exported) recognises realtime-pulse canonical paths","status":"passed","title":"recognises realtime-pulse canonical paths","duration":0.744213000000002,"failureMessages":[],"location":{"line":150,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["inferArticleType (re-exported)"],"fullName":"inferArticleType (re-exported) falls back to political-intelligence for unknown paths","status":"passed","title":"falls back to political-intelligence for unknown paths","duration":0.47831500000000915,"failureMessages":[],"location":{"line":156,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget audit regression: max=88 EN title no longer overshoots the 70-char hardMax","status":"passed","title":"audit regression: max=88 EN title no longer overshoots the 70-char hardMax","duration":2.779092999999989,"failureMessages":[],"location":{"line":186,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget short H1 ships with the brand suffix and NO date prefix","status":"passed","title":"short H1 ships with the brand suffix and NO date prefix","duration":1.0189579999999978,"failureMessages":[],"location":{"line":200,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=en never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=en never overshoots titleWindowForLanguage(lang).hardMax","duration":0.8367269999999962,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=sv never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=sv never overshoots titleWindowForLanguage(lang).hardMax","duration":0.9817980000000261,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=da never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=da never overshoots titleWindowForLanguage(lang).hardMax","duration":1.0872549999999706,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=no never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=no never overshoots titleWindowForLanguage(lang).hardMax","duration":0.8238129999999728,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=fi never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=fi never overshoots titleWindowForLanguage(lang).hardMax","duration":0.6863250000000107,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=de never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=de never overshoots titleWindowForLanguage(lang).hardMax","duration":0.7179639999999949,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=fr never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=fr never overshoots titleWindowForLanguage(lang).hardMax","duration":0.8237219999999752,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=es never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=es never overshoots titleWindowForLanguage(lang).hardMax","duration":0.7528599999999983,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=nl never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=nl never overshoots titleWindowForLanguage(lang).hardMax","duration":0.7558449999999652,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=ar never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=ar never overshoots titleWindowForLanguage(lang).hardMax","duration":1.121690000000001,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=he never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=he never overshoots titleWindowForLanguage(lang).hardMax","duration":0.7201780000000326,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=ja never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=ja never overshoots titleWindowForLanguage(lang).hardMax","duration":0.8372669999999971,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=ko never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=ko never overshoots titleWindowForLanguage(lang).hardMax","duration":0.7334829999999783,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget over-budget H1 in lang=zh never overshoots titleWindowForLanguage(lang).hardMax","status":"passed","title":"over-budget H1 in lang=zh never overshoots titleWindowForLanguage(lang).hardMax","duration":0.7618969999999763,"failureMessages":[],"location":{"line":217,"column":21},"meta":{},"tags":[]},{"ancestorTitles":["computeArticleHeadMetadata — branded respects per-language SERP budget"],"fullName":"computeArticleHeadMetadata — branded respects per-language SERP budget truncated branded title from the news/index card regression no longer reads \"…Five… — Riksdagsmonitor\"","status":"passed","title":"truncated branded title from the news/index card regression no longer reads \"…Five… — Riksdagsmonitor\"","duration":0.8229709999999386,"failureMessages":[],"location":{"line":234,"column":3},"meta":{},"tags":[]}],"startTime":1787953825362,"endTime":1787953825398.823,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-head-metadata.test.ts"},{"assertionResults":[{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish returns English markdown unchanged when lang === \"en\"","status":"passed","title":"returns English markdown unchanged when lang === \"en\"","duration":5.007345999999984,"failureMessages":[],"location":{"line":96,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish overlays localized title/language but keeps English executive-brief description","status":"passed","title":"overlays localized title/language but keeps English executive-brief description","duration":8.358641000000034,"failureMessages":[],"location":{"line":105,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish keeps canonical-identity front-matter fields from the English source","status":"passed","title":"keeps canonical-identity front-matter fields from the English source","duration":1.8800800000000208,"failureMessages":[],"location":{"line":117,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish places the localized body BEFORE the English body, separated by the boundary heading","status":"passed","title":"places the localized body BEFORE the English body, separated by the boundary heading","duration":1.1795590000000402,"failureMessages":[],"location":{"line":140,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish preserves every English body section in the merged output","status":"passed","title":"preserves every English body section in the merged output","duration":1.1544920000000047,"failureMessages":[],"location":{"line":155,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish preserves the localized body content verbatim","status":"passed","title":"preserves the localized body content verbatim","duration":0.7631590000000301,"failureMessages":[],"location":{"line":168,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish emits the localized aside note on the boundary line so readers know why English follows","status":"passed","title":"emits the localized aside note on the boundary line so readers know why English follows","duration":0.8689570000000231,"failureMessages":[],"location":{"line":177,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish falls back to the English body when the localized file has no body content (FM only)","status":"passed","title":"falls back to the English body when the localized file has no body content (FM only)","duration":1.5063499999999976,"failureMessages":[],"location":{"line":186,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish forces language: even when the localized file forgot to set it","status":"passed","title":"forces language: even when the localized file forgot to set it","duration":1.3221859999999879,"failureMessages":[],"location":{"line":208,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish ignores empty-string localized title/description so English fallback wins","status":"passed","title":"ignores empty-string localized title/description so English fallback wins","duration":1.428754999999967,"failureMessages":[],"location":{"line":228,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish ignores localizedBriefMarkdown — does NOT rewrite title/description from the brief","status":"passed","title":"ignores localizedBriefMarkdown — does NOT rewrite title/description from the brief","duration":0.7737989999999968,"failureMessages":[],"location":{"line":265,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish ignores localizedBriefMarkdown even when the localized article is missing","status":"passed","title":"ignores localizedBriefMarkdown even when the localized article is missing","duration":1.1150779999999827,"failureMessages":[],"location":{"line":292,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["mergeLocalizedWithEnglish"],"fullName":"mergeLocalizedWithEnglish falls back to English title/description when both localized inputs are missing","status":"passed","title":"falls back to English title/description when both localized inputs are missing","duration":0.6857840000000124,"failureMessages":[],"location":{"line":322,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"sv\"","status":"passed","title":"emits a non-empty H2 + aside note for \"sv\"","duration":0.6601059999999848,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"da\"","status":"passed","title":"emits a non-empty H2 + aside note for \"da\"","duration":0.5625739999999837,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"no\"","status":"passed","title":"emits a non-empty H2 + aside note for \"no\"","duration":0.5231090000000336,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"fi\"","status":"passed","title":"emits a non-empty H2 + aside note for \"fi\"","duration":0.5486169999999788,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"de\"","status":"passed","title":"emits a non-empty H2 + aside note for \"de\"","duration":0.48360499999995454,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"fr\"","status":"passed","title":"emits a non-empty H2 + aside note for \"fr\"","duration":0.5049559999999929,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"es\"","status":"passed","title":"emits a non-empty H2 + aside note for \"es\"","duration":0.5158959999999979,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"nl\"","status":"passed","title":"emits a non-empty H2 + aside note for \"nl\"","duration":0.5177290000000312,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"ar\"","status":"passed","title":"emits a non-empty H2 + aside note for \"ar\"","duration":0.5282589999999914,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"he\"","status":"passed","title":"emits a non-empty H2 + aside note for \"he\"","duration":0.5093339999999671,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"ja\"","status":"passed","title":"emits a non-empty H2 + aside note for \"ja\"","duration":0.49261200000000827,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"ko\"","status":"passed","title":"emits a non-empty H2 + aside note for \"ko\"","duration":0.5261449999999854,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]},{"ancestorTitles":["buildEnglishCoverageBoundary"],"fullName":"buildEnglishCoverageBoundary emits a non-empty H2 + aside note for \"zh\"","status":"passed","title":"emits a non-empty H2 + aside note for \"zh\"","duration":0.6841309999999794,"failureMessages":[],"location":{"line":339,"column":47},"meta":{},"tags":[]}],"startTime":1787953795304,"endTime":1787953795337.684,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-merge.test.ts"},{"assertionResults":[{"ancestorTitles":["pipeline interfaces — type contracts"],"fullName":"pipeline interfaces — type contracts PipelineResult success branch has ok=true and value","status":"passed","title":"PipelineResult success branch has ok=true and value","duration":4.335527999999954,"failureMessages":[],"location":{"line":79,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["pipeline interfaces — type contracts"],"fullName":"pipeline interfaces — type contracts PipelineResult failure branch has ok=false and error","status":"passed","title":"PipelineResult failure branch has ok=false and error","duration":0.9173779999999851,"failureMessages":[],"location":{"line":87,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["pipeline interfaces — type contracts"],"fullName":"pipeline interfaces — type contracts PipelineResult success branch supports optional warnings","status":"passed","title":"PipelineResult success branch supports optional warnings","duration":1.5384599999999864,"failureMessages":[],"location":{"line":95,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["pipeline interfaces — type contracts"],"fullName":"pipeline interfaces — type contracts PipelineResult failure branch supports optional warnings","status":"passed","title":"PipelineResult failure branch supports optional warnings","duration":0.6308909999999059,"failureMessages":[],"location":{"line":104,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["pipeline interfaces — type contracts"],"fullName":"pipeline interfaces — type contracts ValidationDiagnostic supports all severity levels","status":"passed","title":"ValidationDiagnostic supports all severity levels","duration":0.7718449999999848,"failureMessages":[],"location":{"line":113,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["pipeline interfaces — type contracts"],"fullName":"pipeline interfaces — type contracts ArticleSection ties markdown to its source file","status":"passed","title":"ArticleSection ties markdown to its source file","duration":0.7817239999999401,"failureMessages":[],"location":{"line":125,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — happy path"],"fullName":"runArticlePipeline — happy path produces a successful result with minimal analysis folder","status":"passed","title":"produces a successful result with minimal analysis folder","duration":34.01702999999998,"failureMessages":[],"location":{"line":138,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — happy path"],"fullName":"runArticlePipeline — happy path extracts title from the executive-brief H1","status":"passed","title":"extracts title from the executive-brief H1","duration":3.1966449999999895,"failureMessages":[],"location":{"line":153,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — happy path"],"fullName":"runArticlePipeline — happy path extracts description from the BLUF paragraph","status":"passed","title":"extracts description from the BLUF paragraph","duration":1.9959370000000263,"failureMessages":[],"location":{"line":165,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — happy path"],"fullName":"runArticlePipeline — happy path includes YAML front-matter with required fields","status":"passed","title":"includes YAML front-matter with required fields","duration":2.4262730000000374,"failureMessages":[],"location":{"line":177,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — happy path"],"fullName":"runArticlePipeline — happy path config overrides are wired into the front-matter","status":"passed","title":"config overrides are wired into the front-matter","duration":2.604155999999989,"failureMessages":[],"location":{"line":203,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — happy path"],"fullName":"runArticlePipeline — happy path aggregates multiple artifacts in canonical order","status":"passed","title":"aggregates multiple artifacts in canonical order","duration":20.333439999999996,"failureMessages":[],"location":{"line":221,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — error cases"],"fullName":"runArticlePipeline — error cases returns error when subfolder does not exist","status":"passed","title":"returns error when subfolder does not exist","duration":0.7383929999999737,"failureMessages":[],"location":{"line":253,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — error cases"],"fullName":"runArticlePipeline — error cases returns error when executive-brief.md is missing","status":"passed","title":"returns error when executive-brief.md is missing","duration":0.8017610000000559,"failureMessages":[],"location":{"line":267,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — error cases"],"fullName":"runArticlePipeline — error cases handles empty executive-brief.md gracefully","status":"passed","title":"handles empty executive-brief.md gracefully","duration":2.091316000000006,"failureMessages":[],"location":{"line":283,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — error cases"],"fullName":"runArticlePipeline — error cases handles executive-brief.md with only YAML front-matter","status":"passed","title":"handles executive-brief.md with only YAML front-matter","duration":6.066368000000011,"failureMessages":[],"location":{"line":296,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — edge cases"],"fullName":"runArticlePipeline — edge cases excludes README.md from aggregation","status":"passed","title":"excludes README.md from aggregation","duration":1.9094450000000052,"failureMessages":[],"location":{"line":310,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — edge cases"],"fullName":"runArticlePipeline — edge cases excludes article.md and article..md from aggregation","status":"passed","title":"excludes article.md and article..md from aggregation","duration":1.9630450000000792,"failureMessages":[],"location":{"line":324,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — edge cases"],"fullName":"runArticlePipeline — edge cases handles artifacts with malformed YAML front-matter","status":"passed","title":"handles artifacts with malformed YAML front-matter","duration":1.278925000000072,"failureMessages":[],"location":{"line":339,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["runArticlePipeline — edge cases"],"fullName":"runArticlePipeline — edge cases handles supplementary artifacts not in AGGREGATION_ORDER","status":"passed","title":"handles supplementary artifacts not in AGGREGATION_ORDER","duration":2.05973599999993,"failureMessages":[],"location":{"line":366,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) demotes ## to ###","status":"passed","title":"demotes ## to ###","duration":0.7142979999999852,"failureMessages":[],"location":{"line":387,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) demotes ### to ####","status":"passed","title":"demotes ### to ####","duration":0.6263030000000072,"failureMessages":[],"location":{"line":391,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) caps at ###### (does not produce #######)","status":"passed","title":"caps at ###### (does not produce #######)","duration":0.595956000000001,"failureMessages":[],"location":{"line":395,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) leaves H1 untouched (already stripped upstream)","status":"passed","title":"leaves H1 untouched (already stripped upstream)","duration":0.6196199999999408,"failureMessages":[],"location":{"line":399,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) preserves headings inside fenced code blocks","status":"passed","title":"preserves headings inside fenced code blocks","duration":0.6019370000000208,"failureMessages":[],"location":{"line":403,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) preserves headings inside tilde-fenced code blocks","status":"passed","title":"preserves headings inside tilde-fenced code blocks","duration":0.549398999999994,"failureMessages":[],"location":{"line":408,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) handles multiple headings at different levels","status":"passed","title":"handles multiple headings at different levels","duration":0.6114140000000816,"failureMessages":[],"location":{"line":413,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) handles empty string","status":"passed","title":"handles empty string","duration":0.574226000000067,"failureMessages":[],"location":{"line":419,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) handles text without headings","status":"passed","title":"handles text without headings","duration":0.6797819999999319,"failureMessages":[],"location":{"line":423,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["heading-demotion (extracted module)"],"fullName":"heading-demotion (extracted module) does not demote hash characters in non-heading context","status":"passed","title":"does not demote hash characters in non-heading context","duration":0.6319229999999152,"failureMessages":[],"location":{"line":428,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) rewrites relative .md links to GitHub blob URLs","status":"passed","title":"rewrites relative .md links to GitHub blob URLs","duration":0.7033969999999954,"failureMessages":[],"location":{"line":437,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) preserves absolute https:// links","status":"passed","title":"preserves absolute https:// links","duration":0.7323010000000068,"failureMessages":[],"location":{"line":443,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) preserves fragment-only links","status":"passed","title":"preserves fragment-only links","duration":0.9518820000000687,"failureMessages":[],"location":{"line":448,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) preserves mailto: links","status":"passed","title":"preserves mailto: links","duration":0.5668809999999667,"failureMessages":[],"location":{"line":453,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) handles relative links with anchors","status":"passed","title":"handles relative links with anchors","duration":0.5637749999999642,"failureMessages":[],"location":{"line":458,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) handles relative paths with ../","status":"passed","title":"handles relative paths with ../","duration":0.592640000000074,"failureMessages":[],"location":{"line":464,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) handles empty body","status":"passed","title":"handles empty body","duration":0.5960159999999632,"failureMessages":[],"location":{"line":470,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["link-rewriting (extracted module)"],"fullName":"link-rewriting (extracted module) handles multiple links in the same line","status":"passed","title":"handles multiple links in the same line","duration":0.6040219999999863,"failureMessages":[],"location":{"line":474,"column":3},"meta":{},"tags":[]}],"startTime":1787953735539,"endTime":1787953735645.604,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-pipeline.test.ts"},{"assertionResults":[{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips wraps HIGH confidence in a green chip","status":"passed","title":"wraps HIGH confidence in a green chip","duration":4.095128000000045,"failureMessages":[],"location":{"line":17,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips wraps MEDIUM confidence in an amber chip","status":"passed","title":"wraps MEDIUM confidence in an amber chip","duration":0.6299089999999978,"failureMessages":[],"location":{"line":24,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips wraps LOW confidence in a red chip","status":"passed","title":"wraps LOW confidence in a red chip","duration":0.48821399999997084,"failureMessages":[],"location":{"line":30,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips handles multiple confidence levels in same string","status":"passed","title":"handles multiple confidence levels in same string","duration":0.5228089999999952,"failureMessages":[],"location":{"line":36,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips is case-insensitive","status":"passed","title":"is case-insensitive","duration":0.5215870000000109,"failureMessages":[],"location":{"line":43,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips does not modify heading id attributes containing high/medium/low","status":"passed","title":"does not modify heading id attributes containing high/medium/low","duration":0.5889129999999909,"failureMessages":[],"location":{"line":49,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips does not modify href attributes containing high/medium/low","status":"passed","title":"does not modify href attributes containing high/medium/low","duration":0.49079000000000406,"failureMessages":[],"location":{"line":57,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformConfidenceChips"],"fullName":"Article Scannability Transforms transformConfidenceChips does not inject spans into class or data attributes","status":"passed","title":"does not inject spans into class or data attributes","duration":0.5123199999999883,"failureMessages":[],"location":{"line":65,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformAdmiraltyBadges"],"fullName":"Article Scannability Transforms transformAdmiraltyBadges wraps Admiralty codes in styled badges with tooltips","status":"passed","title":"wraps Admiralty codes in styled badges with tooltips","duration":0.8726390000000492,"failureMessages":[],"location":{"line":75,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformAdmiraltyBadges"],"fullName":"Article Scannability Transforms transformAdmiraltyBadges handles multiple codes","status":"passed","title":"handles multiple codes","duration":0.6911049999999932,"failureMessages":[],"location":{"line":83,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformAdmiraltyBadges"],"fullName":"Article Scannability Transforms transformAdmiraltyBadges does not match non-Admiralty patterns","status":"passed","title":"does not match non-Admiralty patterns","duration":0.7104800000000182,"failureMessages":[],"location":{"line":91,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformAdmiraltyBadges"],"fullName":"Article Scannability Transforms transformAdmiraltyBadges does not modify attributes containing Admiralty-like patterns","status":"passed","title":"does not modify attributes containing Admiralty-like patterns","duration":0.5417640000000006,"failureMessages":[],"location":{"line":97,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformTimelineIndicators"],"fullName":"Article Scannability Transforms transformTimelineIndicators wraps T+7d as urgent","status":"passed","title":"wraps T+7d as urgent","duration":0.6570999999999572,"failureMessages":[],"location":{"line":105,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformTimelineIndicators"],"fullName":"Article Scannability Transforms transformTimelineIndicators wraps T+30d as near","status":"passed","title":"wraps T+30d as near","duration":0.46278599999999415,"failureMessages":[],"location":{"line":112,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformTimelineIndicators"],"fullName":"Article Scannability Transforms transformTimelineIndicators wraps T+90d as horizon","status":"passed","title":"wraps T+90d as horizon","duration":0.4607029999999668,"failureMessages":[],"location":{"line":118,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformTimelineIndicators"],"fullName":"Article Scannability Transforms transformTimelineIndicators preserves original text inside span","status":"passed","title":"preserves original text inside span","duration":0.44260799999995015,"failureMessages":[],"location":{"line":124,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformTimelineIndicators"],"fullName":"Article Scannability Transforms transformTimelineIndicators does not modify attributes containing timeline-like patterns","status":"passed","title":"does not modify attributes containing timeline-like patterns","duration":0.47020099999997456,"failureMessages":[],"location":{"line":130,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformProgressiveDisclosure"],"fullName":"Article Scannability Transforms transformProgressiveDisclosure wraps Document Analysis H2 in details element","status":"passed","title":"wraps Document Analysis H2 in details element","duration":1.4615359999999669,"failureMessages":[],"location":{"line":140,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformProgressiveDisclosure"],"fullName":"Article Scannability Transforms transformProgressiveDisclosure wraps Intelligence Notes in details element","status":"passed","title":"wraps Intelligence Notes in details element","duration":0.5404819999999972,"failureMessages":[],"location":{"line":148,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformProgressiveDisclosure"],"fullName":"Article Scannability Transforms transformProgressiveDisclosure does not wrap non-matching headings","status":"passed","title":"does not wrap non-matching headings","duration":0.5762389999999868,"failureMessages":[],"location":{"line":155,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformProgressiveDisclosure"],"fullName":"Article Scannability Transforms transformProgressiveDisclosure escapes residual markup in the disclosure summary","status":"passed","title":"escapes residual markup in the disclosure summary","duration":0.7264299999999935,"failureMessages":[],"location":{"line":161,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformProgressiveDisclosure"],"fullName":"Article Scannability Transforms transformProgressiveDisclosure strips overlapping tags without reconstituting markup in the summary","status":"passed","title":"strips overlapping tags without reconstituting markup in the summary","duration":0.5682140000000118,"failureMessages":[],"location":{"line":169,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","transformProgressiveDisclosure"],"fullName":"Article Scannability Transforms transformProgressiveDisclosure handles Swedish headings","status":"passed","title":"handles Swedish headings","duration":0.5226289999999949,"failureMessages":[],"location":{"line":182,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc generates TOC from H2 headings","status":"passed","title":"generates TOC from H2 headings","duration":1.4731479999999806,"failureMessages":[],"location":{"line":190,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc wraps the TOC in a collapsible sidebar disclosure","status":"passed","title":"wraps the TOC in a collapsible sidebar disclosure","duration":0.5855660000000285,"failureMessages":[],"location":{"line":201,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc assigns canonical icons and reading-depth layers from the section id","status":"passed","title":"assigns canonical icons and reading-depth layers from the section id","duration":0.7190160000000105,"failureMessages":[],"location":{"line":210,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc falls back to a default icon for unknown dynamic sections","status":"passed","title":"falls back to a default icon for unknown dynamic sections","duration":0.6223449999999957,"failureMessages":[],"location":{"line":228,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc returns empty string for single-section articles","status":"passed","title":"returns empty string for single-section articles","duration":0.5838229999999953,"failureMessages":[],"location":{"line":234,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc uses Swedish label for sv lang","status":"passed","title":"uses Swedish label for sv lang","duration":0.6539539999999988,"failureMessages":[],"location":{"line":240,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc localizes the layer badge label for non-English languages","status":"passed","title":"localizes the layer badge label for non-English languages","duration":0.6148110000000315,"failureMessages":[],"location":{"line":246,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc escapes residual markup in TOC link text","status":"passed","title":"escapes residual markup in TOC link text","duration":0.7900500000000079,"failureMessages":[],"location":{"line":253,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc localizes TOC entry text by language-stable section id for non-English","status":"passed","title":"localizes TOC entry text by language-stable section id for non-English","duration":0.9432360000000131,"failureMessages":[],"location":{"line":260,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc keeps English TOC entry text byte-identical to the body heading","status":"passed","title":"keeps English TOC entry text byte-identical to the body heading","duration":0.6480829999999855,"failureMessages":[],"location":{"line":276,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc reuses the reader-guide per-document label for the per-document section","status":"passed","title":"reuses the reader-guide per-document label for the per-document section","duration":0.6497460000000501,"failureMessages":[],"location":{"line":286,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","generateArticleToc"],"fullName":"Article Scannability Transforms generateArticleToc falls back to the heading text for sections without a curated localisation","status":"passed","title":"falls back to the heading text for sections without a curated localisation","duration":0.5895739999999705,"failureMessages":[],"location":{"line":292,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","renderMethodologyFooter"],"fullName":"Article Scannability Transforms renderMethodologyFooter renders English methodology footer","status":"passed","title":"renders English methodology footer","duration":0.7690299999999866,"failureMessages":[],"location":{"line":300,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","renderMethodologyFooter"],"fullName":"Article Scannability Transforms renderMethodologyFooter renders Swedish methodology footer","status":"passed","title":"renders Swedish methodology footer","duration":0.5565819999999917,"failureMessages":[],"location":{"line":310,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","renderMethodologyFooter"],"fullName":"Article Scannability Transforms renderMethodologyFooter falls back to English for unsupported languages","status":"passed","title":"falls back to English for unsupported languages","duration":0.5539880000000039,"failureMessages":[],"location":{"line":315,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Article Scannability Transforms","applyScannabilityTransforms"],"fullName":"Article Scannability Transforms applyScannabilityTransforms applies inline transforms and returns TOC + footer (no progressive disclosure)","status":"passed","title":"applies inline transforms and returns TOC + footer (no progressive disclosure)","duration":0.9673710000000142,"failureMessages":[],"location":{"line":322,"column":5},"meta":{},"tags":[]}],"startTime":1787953788443,"endTime":1787953788472.9673,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-scannability.test.ts"},{"assertionResults":[{"ancestorTitles":["buildArticleKeywords — EN path (regression baseline)"],"fullName":"buildArticleKeywords — EN path (regression baseline) keeps the original EN ordering and includes the EN core keyword set","status":"passed","title":"keeps the original EN ordering and includes the EN core keyword set","duration":4.888503999999955,"failureMessages":[],"location":{"line":66,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks does NOT include the English frontmatter `keywords:` seed","status":"passed","title":"does NOT include the English frontmatter `keywords:` seed","duration":1.0770770000000311,"failureMessages":[],"location":{"line":92,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks does NOT include the English Language-Meta `name`","status":"passed","title":"does NOT include the English Language-Meta `name`","duration":0.6129280000000108,"failureMessages":[],"location":{"line":102,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks does NOT include the English article-type ID hyphen-slug","status":"passed","title":"does NOT include the English article-type ID hyphen-slug","duration":0.5645470000000046,"failureMessages":[],"location":{"line":108,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks does NOT include English canonical-path slug parts","status":"passed","title":"does NOT include English canonical-path slug parts","duration":0.6287680000000364,"failureMessages":[],"location":{"line":114,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks DOES include the German core keyword set","status":"passed","title":"DOES include the German core keyword set","duration":0.7993170000000305,"failureMessages":[],"location":{"line":120,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks does NOT inject any English `update` word in the publication keyword","status":"passed","title":"does NOT inject any English `update` word in the publication keyword","duration":0.6393279999999777,"failureMessages":[],"location":{"line":129,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks includes the German government keyword (institutional floor)","status":"passed","title":"includes the German government keyword (institutional floor)","duration":0.5175889999999868,"failureMessages":[],"location":{"line":139,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks surfaces the localized article-type label","status":"passed","title":"surfaces the localized article-type label","duration":0.6643640000000346,"failureMessages":[],"location":{"line":146,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — non-EN path drops EN seed leaks"],"fullName":"buildArticleKeywords — non-EN path drops EN seed leaks does NOT leak EN title tokens (Enshrines / Protection / Abortion) under DE","status":"passed","title":"does NOT leak EN title tokens (Enshrines / Protection / Abortion) under DE","duration":0.5261849999999981,"failureMessages":[],"location":{"line":151,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — Arabic (RTL) localization"],"fullName":"buildArticleKeywords — Arabic (RTL) localization uses native Arabic core keywords and no English leakage","status":"passed","title":"uses native Arabic core keywords and no English leakage","duration":1.3207729999999742,"failureMessages":[],"location":{"line":160,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — Japanese (CJK) localization"],"fullName":"buildArticleKeywords — Japanese (CJK) localization uses native Japanese core keywords and no English leakage","status":"passed","title":"uses native Japanese core keywords and no English leakage","duration":0.7230429999999615,"failureMessages":[],"location":{"line":185,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=en including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=en including Riksdagsmonitor","duration":0.6755559999999718,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=sv including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=sv including Riksdagsmonitor","duration":0.45394999999996344,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=da including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=da including Riksdagsmonitor","duration":0.5163969999999836,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=no including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=no including Riksdagsmonitor","duration":0.4419680000000312,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=fi including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=fi including Riksdagsmonitor","duration":0.5153940000000148,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=de including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=de including Riksdagsmonitor","duration":0.47003100000000586,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=fr including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=fr including Riksdagsmonitor","duration":0.5101960000000076,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=es including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=es including Riksdagsmonitor","duration":0.4838970000000131,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=nl including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=nl including Riksdagsmonitor","duration":0.6627809999999954,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=ar including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=ar including Riksdagsmonitor","duration":0.5599379999999883,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=he including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=he including Riksdagsmonitor","duration":0.6255820000000085,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=ja including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=ja including Riksdagsmonitor","duration":0.5051559999999995,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=ko including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=ko including Riksdagsmonitor","duration":0.4894170000000031,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["buildArticleKeywords — covers every supported language"],"fullName":"buildArticleKeywords — covers every supported language returns a non-empty keyword string for lang=zh including Riksdagsmonitor","status":"passed","title":"returns a non-empty keyword string for lang=zh including Riksdagsmonitor","duration":0.5987509999999929,"failureMessages":[],"location":{"line":212,"column":5},"meta":{},"tags":[]}],"startTime":1787953830951,"endTime":1787953830971.5986,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-seo-localized-keywords.test.ts"},{"assertionResults":[{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression strips a trailing \"and\" connector left after word-boundary truncation","status":"passed","title":"strips a trailing \"and\" connector left after word-boundary truncation","duration":6.6264659999999935,"failureMessages":[],"location":{"line":36,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression strips a trailing \"with\" connector","status":"passed","title":"strips a trailing \"with\" connector","duration":2.2467169999999896,"failureMessages":[],"location":{"line":48,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression ships short brief H1s as \"{H1} — Riksdagsmonitor\" with NO date prefix","status":"passed","title":"ships short brief H1s as \"{H1} — Riksdagsmonitor\" with NO date prefix","duration":0.9580339999999978,"failureMessages":[],"location":{"line":56,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression strips trailing connector AND date prefix when H1 just fits without brand","status":"passed","title":"strips trailing connector AND date prefix when H1 just fits without brand","duration":0.5535669999999868,"failureMessages":[],"location":{"line":81,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression never prepends a localized date prefix in any of the 14 supported languages","status":"passed","title":"never prepends a localized date prefix in any of the 14 supported languages","duration":1.9180510000000481,"failureMessages":[],"location":{"line":93,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression strips Swedish connector \"och\" when truncating a Swedish H1","status":"passed","title":"strips Swedish connector \"och\" when truncating a Swedish H1","duration":0.608019000000013,"failureMessages":[],"location":{"line":126,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression strips German connector \"und\" when truncating a German H1","status":"passed","title":"strips German connector \"und\" when truncating a German H1","duration":0.5581549999999993,"failureMessages":[],"location":{"line":133,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["buildSeoTitle — trailing-connector regression"],"fullName":"buildSeoTitle — trailing-connector regression preserves a bare trailing uppercase `A` (live: `Plan A`, `Section A`, `Group A`)","status":"passed","title":"preserves a bare trailing uppercase `A` (live: `Plan A`, `Section A`, `Group A`)","duration":0.7114220000000273,"failureMessages":[],"location":{"line":140,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripTrailingCommaStub — comma-trailing fragment guard"],"fullName":"stripTrailingCommaStub — comma-trailing fragment guard strips a 2-word noun-phrase tail after the last comma","status":"passed","title":"strips a 2-word noun-phrase tail after the last comma","duration":0.6426240000000121,"failureMessages":[],"location":{"line":181,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripTrailingCommaStub — comma-trailing fragment guard"],"fullName":"stripTrailingCommaStub — comma-trailing fragment guard strips a 1-word noun tail (`the`-style determiner is a connector and is already stripped upstream)","status":"passed","title":"strips a 1-word noun tail (`the`-style determiner is a connector and is already stripped upstream)","duration":0.7876640000000066,"failureMessages":[],"location":{"line":189,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripTrailingCommaStub — comma-trailing fragment guard"],"fullName":"stripTrailingCommaStub — comma-trailing fragment guard preserves the original text when the tail is too long (likely real clause)","status":"passed","title":"preserves the original text when the tail is too long (likely real clause)","duration":0.5269059999999968,"failureMessages":[],"location":{"line":196,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripTrailingCommaStub — comma-trailing fragment guard"],"fullName":"stripTrailingCommaStub — comma-trailing fragment guard preserves the text when the head is short (would over-strip)","status":"passed","title":"preserves the text when the head is short (would over-strip)","duration":0.43124699999998484,"failureMessages":[],"location":{"line":204,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripTrailingCommaStub — comma-trailing fragment guard"],"fullName":"stripTrailingCommaStub — comma-trailing fragment guard preserves text with no comma","status":"passed","title":"preserves text with no comma","duration":0.44062500000001137,"failureMessages":[],"location":{"line":210,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["stripTrailingCommaStub — comma-trailing fragment guard"],"fullName":"stripTrailingCommaStub — comma-trailing fragment guard preserves a tail that ends with a sentence terminator (real prose)","status":"passed","title":"preserves a tail that ends with a sentence terminator (real prose)","duration":0.45865799999995716,"failureMessages":[],"location":{"line":215,"column":3},"meta":{},"tags":[]}],"startTime":1787953823322,"endTime":1787953823340.4587,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-seo-title-truncation.test.ts"},{"assertionResults":[{"ancestorTitles":["article-type-i18n","coverage"],"fullName":"article-type-i18n coverage every map entry covers all 14 languages with a non-empty string","status":"passed","title":"every map entry covers all 14 languages with a non-empty string","duration":15.611520999999982,"failureMessages":[],"location":{"line":22,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","coverage"],"fullName":"article-type-i18n coverage every registry article-type id has a localised label map","status":"passed","title":"every registry article-type id has a localised label map","duration":1.177124000000049,"failureMessages":[],"location":{"line":33,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","articleTypeLabel()"],"fullName":"article-type-i18n articleTypeLabel() returns the localised label when both type and language are registered","status":"passed","title":"returns the localised label when both type and language are registered","duration":0.6559080000000108,"failureMessages":[],"location":{"line":45,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","articleTypeLabel()"],"fullName":"article-type-i18n articleTypeLabel() falls back to the supplied English label for unknown type ids","status":"passed","title":"falls back to the supplied English label for unknown type ids","duration":0.391413,"failureMessages":[],"location":{"line":51,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","articleTypeLabel()"],"fullName":"article-type-i18n articleTypeLabel() returns the English entry when lang is \"en\"","status":"passed","title":"returns the English entry when lang is \"en\"","duration":0.5538569999999936,"failureMessages":[],"location":{"line":55,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","articleTypeLabel()"],"fullName":"article-type-i18n articleTypeLabel() preserves RTL strings exactly (Arabic, Hebrew)","status":"passed","title":"preserves RTL strings exactly (Arabic, Hebrew)","duration":0.5181709999999953,"failureMessages":[],"location":{"line":59,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","articleTypeIcon()"],"fullName":"article-type-i18n articleTypeIcon() returns a distinct emoji icon for every registered article type","status":"passed","title":"returns a distinct emoji icon for every registered article type","duration":1.4289359999999647,"failureMessages":[],"location":{"line":66,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","articleTypeIcon()"],"fullName":"article-type-i18n articleTypeIcon() falls back to 🔍 for unknown article-type ids","status":"passed","title":"falls back to 🔍 for unknown article-type ids","duration":0.441737000000046,"failureMessages":[],"location":{"line":77,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-type-i18n","articleTypeIcon()"],"fullName":"article-type-i18n articleTypeIcon() returns the registered icon for known types","status":"passed","title":"returns the registered icon for known types","duration":0.5764289999999619,"failureMessages":[],"location":{"line":81,"column":5},"meta":{},"tags":[]}],"startTime":1787953907316,"endTime":1787953907337.5764,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-type-i18n.test.ts"},{"assertionResults":[{"ancestorTitles":["article-types registry — structural validity"],"fullName":"article-types registry — structural validity parses as JSON and declares a semantic version","status":"passed","title":"parses as JSON and declares a semantic version","duration":4.780238999999995,"failureMessages":[],"location":{"line":74,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — structural validity"],"fullName":"article-types registry — structural validity declares at least the 13 known article types","status":"passed","title":"declares at least the 13 known article types","duration":2.3227190000000064,"failureMessages":[],"location":{"line":80,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — structural validity"],"fullName":"article-types registry — structural validity every type id is unique","status":"passed","title":"every type id is unique","duration":0.520183999999972,"failureMessages":[],"location":{"line":103,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — structural validity"],"fullName":"article-types registry — structural validity every subfolder is unique","status":"passed","title":"every subfolder is unique","duration":0.4132940000000076,"failureMessages":[],"location":{"line":109,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — workflow ↔ registry parity"],"fullName":"article-types registry — workflow ↔ registry parity every type with a workflow points to a real news-*.md source","status":"passed","title":"every type with a workflow points to a real news-*.md source","duration":0.8708300000000122,"failureMessages":[],"location":{"line":123,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — workflow ↔ registry parity"],"fullName":"article-types registry — workflow ↔ registry parity every news-*.md (except news-translate) has a registry entry","status":"passed","title":"every news-*.md (except news-translate) has a registry entry","duration":0.643714999999986,"failureMessages":[],"location":{"line":130,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — long-horizon rules"],"fullName":"article-types registry — long-horizon rules every long-horizon-forecast declares longHorizonRules","status":"passed","title":"every long-horizon-forecast declares longHorizonRules","duration":0.6919060000000172,"failureMessages":[],"location":{"line":143,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — long-horizon rules"],"fullName":"article-types registry — long-horizon rules quarter / year / cycle have ascending tier-C multipliers","status":"passed","title":"quarter / year / cycle have ascending tier-C multipliers","duration":0.6726400000000012,"failureMessages":[],"location":{"line":151,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — long-horizon rules"],"fullName":"article-types registry — long-horizon rules cycle horizon is at least 4 years (1460 days)","status":"passed","title":"cycle horizon is at least 4 years (1460 days)","duration":0.6115550000000098,"failureMessages":[],"location":{"line":164,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — long-horizon rules"],"fullName":"article-types registry — long-horizon rules election-cycle declares cycle-trajectory.md as an extra artifact","status":"passed","title":"election-cycle declares cycle-trajectory.md as an extra artifact","duration":0.5166169999999966,"failureMessages":[],"location":{"line":171,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — long-horizon rules"],"fullName":"article-types registry — long-horizon rules year-ahead and election-cycle mandate PESTLE","status":"passed","title":"year-ahead and election-cycle mandate PESTLE","duration":0.5750170000000026,"failureMessages":[],"location":{"line":176,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — election cycle coherence"],"fullName":"article-types registry — election cycle coherence current cycle ends where next cycle begins","status":"passed","title":"current cycle ends where next cycle begins","duration":0.4512149999999906,"failureMessages":[],"location":{"line":185,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — election cycle coherence"],"fullName":"article-types registry — election cycle coherence current cycle covers Tidö mandate (2022-09-11 → 2026-09-13)","status":"passed","title":"current cycle covers Tidö mandate (2022-09-11 → 2026-09-13)","duration":0.5021399999999971,"failureMessages":[],"location":{"line":189,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — election cycle coherence"],"fullName":"article-types registry — election cycle coherence next cycle ends 2030-09-08","status":"passed","title":"next cycle ends 2030-09-08","duration":0.4196359999999686,"failureMessages":[],"location":{"line":194,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — horizon bands"],"fullName":"article-types registry — horizon bands declares the canonical seven horizon bands","status":"passed","title":"declares the canonical seven horizon bands","duration":0.7836670000000368,"failureMessages":[],"location":{"line":200,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — horizon bands"],"fullName":"article-types registry — horizon bands each band has ascending or equal day-count by horizon","status":"passed","title":"each band has ascending or equal day-count by horizon","duration":0.5740949999999998,"failureMessages":[],"location":{"line":207,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — reference-quality-thresholds parity"],"fullName":"article-types registry — reference-quality-thresholds parity quarter-ahead, year-ahead, election-cycle have threshold blocks","status":"passed","title":"quarter-ahead, year-ahead, election-cycle have threshold blocks","duration":0.517879999999991,"failureMessages":[],"location":{"line":227,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts year-ahead: forwardIndicatorHorizons matches fixture (5 bands)","status":"passed","title":"year-ahead: forwardIndicatorHorizons matches fixture (5 bands)","duration":1.2777119999999513,"failureMessages":[],"location":{"line":252,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts year-ahead: every declared band exists in horizonBands registry","status":"passed","title":"year-ahead: every declared band exists in horizonBands registry","duration":0.5691560000000209,"failureMessages":[],"location":{"line":260,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts year-ahead: WEP ceilings in fixture match horizonBands registry","status":"passed","title":"year-ahead: WEP ceilings in fixture match horizonBands registry","duration":0.6327549999999746,"failureMessages":[],"location":{"line":270,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts election-cycle: forwardIndicatorHorizons matches fixture (4 bands)","status":"passed","title":"election-cycle: forwardIndicatorHorizons matches fixture (4 bands)","duration":0.6142600000000016,"failureMessages":[],"location":{"line":252,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts election-cycle: every declared band exists in horizonBands registry","status":"passed","title":"election-cycle: every declared band exists in horizonBands registry","duration":0.5226180000000227,"failureMessages":[],"location":{"line":260,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts election-cycle: WEP ceilings in fixture match horizonBands registry","status":"passed","title":"election-cycle: WEP ceilings in fixture match horizonBands registry","duration":0.48982699999999113,"failureMessages":[],"location":{"line":270,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts week-ahead: forwardIndicatorHorizons matches fixture (5 bands)","status":"passed","title":"week-ahead: forwardIndicatorHorizons matches fixture (5 bands)","duration":0.5591670000000022,"failureMessages":[],"location":{"line":252,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts week-ahead: every declared band exists in horizonBands registry","status":"passed","title":"week-ahead: every declared band exists in horizonBands registry","duration":0.6927569999999719,"failureMessages":[],"location":{"line":260,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts week-ahead: WEP ceilings in fixture match horizonBands registry","status":"passed","title":"week-ahead: WEP ceilings in fixture match horizonBands registry","duration":0.5345009999999775,"failureMessages":[],"location":{"line":270,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts month-ahead: forwardIndicatorHorizons matches fixture (6 bands)","status":"passed","title":"month-ahead: forwardIndicatorHorizons matches fixture (6 bands)","duration":0.5785130000000436,"failureMessages":[],"location":{"line":252,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts month-ahead: every declared band exists in horizonBands registry","status":"passed","title":"month-ahead: every declared band exists in horizonBands registry","duration":0.5340199999999982,"failureMessages":[],"location":{"line":260,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts month-ahead: WEP ceilings in fixture match horizonBands registry","status":"passed","title":"month-ahead: WEP ceilings in fixture match horizonBands registry","duration":0.5762789999999995,"failureMessages":[],"location":{"line":270,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts quarter-ahead: forwardIndicatorHorizons matches fixture (5 bands)","status":"passed","title":"quarter-ahead: forwardIndicatorHorizons matches fixture (5 bands)","duration":0.5633450000000266,"failureMessages":[],"location":{"line":252,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts quarter-ahead: every declared band exists in horizonBands registry","status":"passed","title":"quarter-ahead: every declared band exists in horizonBands registry","duration":0.6365910000000099,"failureMessages":[],"location":{"line":260,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts quarter-ahead: WEP ceilings in fixture match horizonBands registry","status":"passed","title":"quarter-ahead: WEP ceilings in fixture match horizonBands registry","duration":0.6871470000000386,"failureMessages":[],"location":{"line":270,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts six-band coverage: month-ahead declares all 6 bands (72h, week, month, quarter, year, election)","status":"passed","title":"six-band coverage: month-ahead declares all 6 bands (72h, week, month, quarter, year, election)","duration":0.9590049999999906,"failureMessages":[],"location":{"line":280,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["article-types registry — forward-indicator horizon band counts"],"fullName":"article-types registry — forward-indicator horizon band counts back-compat: single-type articles retain 4-band legacy schema","status":"passed","title":"back-compat: single-type articles retain 4-band legacy schema","duration":0.7652520000000322,"failureMessages":[],"location":{"line":291,"column":3},"meta":{},"tags":[]}],"startTime":1787953822339,"endTime":1787953822366.7651,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/article-types.test.ts"},{"assertionResults":[{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n defaults to null when flag is absent","status":"passed","title":"defaults to null when flag is absent","duration":4.601725999999985,"failureMessages":[],"location":{"line":97,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n parses integer value correctly","status":"passed","title":"parses integer value correctly","duration":0.9285489999999754,"failureMessages":[],"location":{"line":102,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n accepts value 0 (explicit disable)","status":"passed","title":"accepts value 0 (explicit disable)","duration":0.5899740000000975,"failureMessages":[],"location":{"line":107,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n accepts larger values","status":"passed","title":"accepts larger values","duration":0.4595510000000331,"failureMessages":[],"location":{"line":112,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n throws on negative value","status":"passed","title":"throws on negative value","duration":1.5456040000000257,"failureMessages":[],"location":{"line":117,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n throws on non-integer value","status":"passed","title":"throws on non-integer value","duration":0.7887560000000349,"failureMessages":[],"location":{"line":123,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n throws on fractional value","status":"passed","title":"throws on fractional value","duration":0.7621669999999767,"failureMessages":[],"location":{"line":129,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n combines correctly with other flags","status":"passed","title":"combines correctly with other flags","duration":0.7539620000000014,"failureMessages":[],"location":{"line":135,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["parseArgs --auto-full-text-top-n"],"fullName":"parseArgs --auto-full-text-top-n parses --full-text-for-all as a boolean flag","status":"passed","title":"parses --full-text-for-all as a boolean flag","duration":0.5617419999999811,"failureMessages":[],"location":{"line":147,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["resolveAutoFullTextTopN"],"fullName":"resolveAutoFullTextTopN raises long-horizon top-N requests to the floor of 10","status":"passed","title":"raises long-horizon top-N requests to the floor of 10","duration":0.606555999999955,"failureMessages":[],"location":{"line":154,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["resolveAutoFullTextTopN"],"fullName":"resolveAutoFullTextTopN uses all selected documents when --full-text-for-all is enabled","status":"passed","title":"uses all selected documents when --full-text-for-all is enabled","duration":0.5267360000000281,"failureMessages":[],"location":{"line":158,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN"],"fullName":"fetchFullTextForTopN returns empty array when topN is 0","status":"passed","title":"returns empty array when topN is 0","duration":1.8535200000000032,"failureMessages":[],"location":{"line":168,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN"],"fullName":"fetchFullTextForTopN returns empty array when docs list is empty","status":"passed","title":"returns empty array when docs list is empty","duration":0.7195169999999962,"failureMessages":[],"location":{"line":175,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN"],"fullName":"fetchFullTextForTopN fetches full text for top-N documents and persists to full-text/ dir","status":"passed","title":"fetches full text for top-N documents and persists to full-text/ dir","duration":3.1307520000000295,"failureMessages":[],"location":{"line":181,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN"],"fullName":"fetchFullTextForTopN only fetches top-N documents even when more docs provided","status":"passed","title":"only fetches top-N documents even when more docs provided","duration":2.611780000000067,"failureMessages":[],"location":{"line":205,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN"],"fullName":"fetchFullTextForTopN creates full-text directory automatically","status":"passed","title":"creates full-text directory automatically","duration":1.2204649999999901,"failureMessages":[],"location":{"line":223,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","graceful degradation — metadata-only response"],"fullName":"fetchFullTextForTopN graceful degradation — metadata-only response records success=false when content is below FULL_TEXT_MIN_LENGTH","status":"passed","title":"records success=false when content is below FULL_TEXT_MIN_LENGTH","duration":1.3589439999999513,"failureMessages":[],"location":{"line":234,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","graceful degradation — metadata-only response"],"fullName":"fetchFullTextForTopN graceful degradation — metadata-only response falls back from text to fullText field when text is too short","status":"passed","title":"falls back from text to fullText field when text is too short","duration":1.2770600000000059,"failureMessages":[],"location":{"line":252,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","graceful degradation — metadata-only response"],"fullName":"fetchFullTextForTopN graceful degradation — metadata-only response falls back to html field when text and fullText are too short","status":"passed","title":"falls back to html field when text and fullText are too short","duration":1.2906860000000506,"failureMessages":[],"location":{"line":267,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","graceful degradation — fetchDocumentDetails throws"],"fullName":"fetchFullTextForTopN graceful degradation — fetchDocumentDetails throws records success=false with reason when MCP call rejects","status":"passed","title":"records success=false with reason when MCP call rejects","duration":1.4787189999999555,"failureMessages":[],"location":{"line":285,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","graceful degradation — fetchDocumentDetails throws"],"fullName":"fetchFullTextForTopN graceful degradation — fetchDocumentDetails throws continues to next document after one fails","status":"passed","title":"continues to next document after one fails","duration":1.6353920000000244,"failureMessages":[],"location":{"line":301,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","dokId resolution"],"fullName":"fetchFullTextForTopN dokId resolution skips documents with no resolvable dok_id","status":"passed","title":"skips documents with no resolvable dok_id","duration":1.1813419999999724,"failureMessages":[],"location":{"line":323,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","dokId resolution"],"fullName":"fetchFullTextForTopN dokId resolution resolves dok_id from dokument_id when dok_id is absent","status":"passed","title":"resolves dok_id from dokument_id when dok_id is absent","duration":1.4481109999999262,"failureMessages":[],"location":{"line":340,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","file content"],"fullName":"fetchFullTextForTopN file content writes markdown file with header and content","status":"passed","title":"writes markdown file with header and content","duration":1.6101850000000013,"failureMessages":[],"location":{"line":357,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","file content"],"fullName":"fetchFullTextForTopN file content filePath in outcome is relative to outputDir (not CWD)","status":"passed","title":"filePath in outcome is relative to outputDir (not CWD)","duration":1.3851539999999432,"failureMessages":[],"location":{"line":374,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["fetchFullTextForTopN","file content"],"fullName":"fetchFullTextForTopN file content sanitizes MP profile text (isPersonProfileText filter)","status":"passed","title":"sanitizes MP profile text (isPersonProfileText filter)","duration":1.2004779999999755,"failureMessages":[],"location":{"line":387,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["serializeDataManifest (via buildWeeklySummaryMarkdown sanity)"],"fullName":"serializeDataManifest (via buildWeeklySummaryMarkdown sanity) buildWeeklySummaryMarkdown still works after refactor","status":"passed","title":"buildWeeklySummaryMarkdown still works after refactor","duration":1.099066999999991,"failureMessages":[],"location":{"line":413,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["manifest full-text outcomes integration contract"],"fullName":"manifest full-text outcomes integration contract parseArgs exposes autoFullTextTopN=2 when flag is set","status":"passed","title":"parseArgs exposes autoFullTextTopN=2 when flag is set","duration":0.9235390000000052,"failureMessages":[],"location":{"line":431,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["manifest full-text outcomes integration contract"],"fullName":"manifest full-text outcomes integration contract fetchFullTextForTopN returns outcome with filePath for successful fetch","status":"passed","title":"fetchFullTextForTopN returns outcome with filePath for successful fetch","duration":1.60837099999992,"failureMessages":[],"location":{"line":436,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["manifest full-text outcomes integration contract"],"fullName":"manifest full-text outcomes integration contract analysis-gate can determine if top-2 full texts are available from outcomes","status":"passed","title":"analysis-gate can determine if top-2 full texts are available from outcomes","duration":1.5156979999999294,"failureMessages":[],"location":{"line":455,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["manifest full-text outcomes integration contract"],"fullName":"manifest full-text outcomes integration contract serializes coverage-state and deferred queue sections in the manifest","status":"passed","title":"serializes coverage-state and deferred queue sections in the manifest","duration":1.821649999999977,"failureMessages":[],"location":{"line":471,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["manifest full-text outcomes integration contract"],"fullName":"manifest full-text outcomes integration contract escapes pipes and collapses newlines in diagnostic manifest cells","status":"passed","title":"escapes pipes and collapses newlines in diagnostic manifest cells","duration":1.3825590000000147,"failureMessages":[],"location":{"line":537,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["manifest full-text outcomes integration contract"],"fullName":"manifest full-text outcomes integration contract escapes backslashes before pipes so escaped-pipe sentinels are unambiguous","status":"passed","title":"escapes backslashes before pipes so escaped-pipe sentinels are unambiguous","duration":1.1899079999999458,"failureMessages":[],"location":{"line":589,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["isDocumentNotIndexedError (transport vs document-level disambiguation)"],"fullName":"isDocumentNotIndexedError (transport vs document-level disambiguation) treats explicit indexing phrases as not_indexed","status":"passed","title":"treats explicit indexing phrases as not_indexed","duration":1.1658429999999953,"failureMessages":[],"location":{"line":644,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["isDocumentNotIndexedError (transport vs document-level disambiguation)"],"fullName":"isDocumentNotIndexedError (transport vs document-level disambiguation) treats transport-level failures as fetch_error, NOT not_indexed","status":"passed","title":"treats transport-level failures as fetch_error, NOT not_indexed","duration":1.1371489999999085,"failureMessages":[],"location":{"line":650,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["isDocumentNotIndexedError (transport vs document-level disambiguation)"],"fullName":"isDocumentNotIndexedError (transport vs document-level disambiguation) only treats bare \"not found\" as not_indexed when paired with the dok_id","status":"passed","title":"only treats bare \"not found\" as not_indexed when paired with the dok_id","duration":1.09241499999996,"failureMessages":[],"location":{"line":658,"column":3},"meta":{},"tags":[]}],"startTime":1787953666729,"endTime":1787953666778.0925,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/auto-full-text-top-n.test.ts"},{"assertionResults":[{"ancestorTitles":["Back to Top Button","DOM Structure"],"fullName":"Back to Top Button DOM Structure should exist in DOM","status":"passed","title":"should exist in DOM","duration":7.35496900000004,"failureMessages":[],"location":{"line":36,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","DOM Structure"],"fullName":"Back to Top Button DOM Structure should have back-to-top class","status":"passed","title":"should have back-to-top class","duration":1.2588170000000218,"failureMessages":[],"location":{"line":41,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","DOM Structure"],"fullName":"Back to Top Button DOM Structure should have proper aria-label for accessibility","status":"passed","title":"should have proper aria-label for accessibility","duration":0.7393749999999955,"failureMessages":[],"location":{"line":45,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","DOM Structure"],"fullName":"Back to Top Button DOM Structure should have arrow content","status":"passed","title":"should have arrow content","duration":0.7227530000000115,"failureMessages":[],"location":{"line":49,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","DOM Structure"],"fullName":"Back to Top Button DOM Structure should have id=\"back-to-top\"","status":"passed","title":"should have id=\"back-to-top\"","duration":0.76636400000001,"failureMessages":[],"location":{"line":53,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Scroll Visibility"],"fullName":"Back to Top Button Scroll Visibility should not have visible class initially","status":"passed","title":"should not have visible class initially","duration":0.612446000000034,"failureMessages":[],"location":{"line":63,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Scroll Visibility"],"fullName":"Back to Top Button Scroll Visibility should add visible class when pageYOffset > 300","status":"passed","title":"should add visible class when pageYOffset > 300","duration":0.8842250000000149,"failureMessages":[],"location":{"line":67,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Scroll Visibility"],"fullName":"Back to Top Button Scroll Visibility should remove visible class when pageYOffset <= 300","status":"passed","title":"should remove visible class when pageYOffset <= 300","duration":0.8134529999999813,"failureMessages":[],"location":{"line":78,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Scroll Visibility"],"fullName":"Back to Top Button Scroll Visibility should remove visible class when pageYOffset is 0","status":"passed","title":"should remove visible class when pageYOffset is 0","duration":0.839492000000007,"failureMessages":[],"location":{"line":89,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Scroll Visibility"],"fullName":"Back to Top Button Scroll Visibility should toggle correctly at boundary (300 = hidden, 301 = visible)","status":"passed","title":"should toggle correctly at boundary (300 = hidden, 301 = visible)","duration":0.7091279999999642,"failureMessages":[],"location":{"line":100,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Scroll Visibility"],"fullName":"Back to Top Button Scroll Visibility should support scroll event listener registration","status":"passed","title":"should support scroll event listener registration","duration":3.5700140000000147,"failureMessages":[],"location":{"line":120,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Click Behavior"],"fullName":"Back to Top Button Click Behavior should support smooth scrolling API","status":"passed","title":"should support smooth scrolling API","duration":0.7839969999999994,"failureMessages":[],"location":{"line":132,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Click Behavior"],"fullName":"Back to Top Button Click Behavior should call scrollTo with smooth behavior when no motion preference","status":"passed","title":"should call scrollTo with smooth behavior when no motion preference","duration":1.6254330000000436,"failureMessages":[],"location":{"line":136,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Click Behavior"],"fullName":"Back to Top Button Click Behavior should call scrollTo with auto behavior when prefers-reduced-motion","status":"passed","title":"should call scrollTo with auto behavior when prefers-reduced-motion","duration":1.07038399999999,"failureMessages":[],"location":{"line":159,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Click Behavior"],"fullName":"Back to Top Button Click Behavior should always scroll to top: 0","status":"passed","title":"should always scroll to top: 0","duration":1.5563830000000394,"failureMessages":[],"location":{"line":181,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Click Behavior"],"fullName":"Back to Top Button Click Behavior should support click event listener registration","status":"passed","title":"should support click event listener registration","duration":1.0796009999999683,"failureMessages":[],"location":{"line":191,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Prefers Reduced Motion"],"fullName":"Back to Top Button Prefers Reduced Motion should check prefers-reduced-motion media query","status":"passed","title":"should check prefers-reduced-motion media query","duration":1.0505269999999882,"failureMessages":[],"location":{"line":203,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Prefers Reduced Motion"],"fullName":"Back to Top Button Prefers Reduced Motion should detect when user prefers reduced motion","status":"passed","title":"should detect when user prefers reduced motion","duration":1.04051800000002,"failureMessages":[],"location":{"line":216,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Prefers Reduced Motion"],"fullName":"Back to Top Button Prefers Reduced Motion should use auto behavior for reduced-motion users","status":"passed","title":"should use auto behavior for reduced-motion users","duration":0.8193840000000137,"failureMessages":[],"location":{"line":228,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Prefers Reduced Motion"],"fullName":"Back to Top Button Prefers Reduced Motion should use smooth behavior for standard users","status":"passed","title":"should use smooth behavior for standard users","duration":0.752448999999956,"failureMessages":[],"location":{"line":234,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Edge Cases"],"fullName":"Back to Top Button Edge Cases should handle missing button gracefully","status":"passed","title":"should handle missing button gracefully","duration":0.853868000000034,"failureMessages":[],"location":{"line":246,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Edge Cases"],"fullName":"Back to Top Button Edge Cases should handle large scroll values","status":"passed","title":"should handle large scroll values","duration":0.8713020000000142,"failureMessages":[],"location":{"line":258,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button","Edge Cases"],"fullName":"Back to Top Button Edge Cases should handle negative scroll values","status":"passed","title":"should handle negative scroll values","duration":0.873395999999957,"failureMessages":[],"location":{"line":266,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button — progressive-enhancement auto-inject"],"fullName":"Back to Top Button — progressive-enhancement auto-inject injects the button when the authored markup is missing","status":"passed","title":"injects the button when the authored markup is missing","duration":2.8070060000000012,"failureMessages":[],"location":{"line":290,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Back to Top Button — progressive-enhancement auto-inject"],"fullName":"Back to Top Button — progressive-enhancement auto-inject reuses the authored button when markup is already present","status":"passed","title":"reuses the authored button when markup is already present","duration":3.9388640000000237,"failureMessages":[],"location":{"line":310,"column":3},"meta":{},"tags":[]}],"startTime":1787953820882,"endTime":1787953820919.939,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/back-to-top.test.js"},{"assertionResults":[{"ancestorTitles":["backfill-news-og-locale-alternate.ts","idempotency"],"fullName":"backfill-news-og-locale-alternate.ts idempotency skips files that already contain og:locale:alternate","status":"passed","title":"skips files that already contain og:locale:alternate","duration":3.8723000000000525,"failureMessages":[],"location":{"line":44,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","safety: no og:locale tag"],"fullName":"backfill-news-og-locale-alternate.ts safety: no og:locale tag does not invent an og:locale block when none exists","status":"passed","title":"does not invent an og:locale block when none exists","duration":0.9966760000000363,"failureMessages":[],"location":{"line":57,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","safety: unknown locale"],"fullName":"backfill-news-og-locale-alternate.ts safety: unknown locale skips files whose og:locale content is not in the lookup table","status":"passed","title":"skips files whose og:locale content is not in the lookup table","duration":0.5508209999999849,"failureMessages":[],"location":{"line":67,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=en (en_US)","status":"passed","title":"injects exactly 13 alternates for lang=en (en_US)","duration":1.2613010000000031,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=sv (sv_SE)","status":"passed","title":"injects exactly 13 alternates for lang=sv (sv_SE)","duration":0.7877050000000168,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=da (da_DK)","status":"passed","title":"injects exactly 13 alternates for lang=da (da_DK)","duration":0.6391160000000013,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=no (nb_NO)","status":"passed","title":"injects exactly 13 alternates for lang=no (nb_NO)","duration":0.7585710000000176,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=fi (fi_FI)","status":"passed","title":"injects exactly 13 alternates for lang=fi (fi_FI)","duration":0.6122059999999578,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=de (de_DE)","status":"passed","title":"injects exactly 13 alternates for lang=de (de_DE)","duration":1.0669980000000123,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=fr (fr_FR)","status":"passed","title":"injects exactly 13 alternates for lang=fr (fr_FR)","duration":0.9943610000000263,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=es (es_ES)","status":"passed","title":"injects exactly 13 alternates for lang=es (es_ES)","duration":0.9327670000000126,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=nl (nl_NL)","status":"passed","title":"injects exactly 13 alternates for lang=nl (nl_NL)","duration":0.8631060000000161,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=ar (ar_SA)","status":"passed","title":"injects exactly 13 alternates for lang=ar (ar_SA)","duration":0.9229080000000067,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=he (he_IL)","status":"passed","title":"injects exactly 13 alternates for lang=he (he_IL)","duration":0.809285999999986,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=ja (ja_JP)","status":"passed","title":"injects exactly 13 alternates for lang=ja (ja_JP)","duration":1.155033000000003,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=ko (ko_KR)","status":"passed","title":"injects exactly 13 alternates for lang=ko (ko_KR)","duration":0.7805409999999711,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","correctness — all 14 languages"],"fullName":"backfill-news-og-locale-alternate.ts correctness — all 14 languages injects exactly 13 alternates for lang=zh (zh_CN)","status":"passed","title":"injects exactly 13 alternates for lang=zh (zh_CN)","duration":0.7447940000000131,"failureMessages":[],"location":{"line":77,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","whitespace preservation"],"fullName":"backfill-news-og-locale-alternate.ts whitespace preservation preserves 2-space leading indentation","status":"passed","title":"preserves 2-space leading indentation","duration":0.6210530000000176,"failureMessages":[],"location":{"line":97,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","whitespace preservation"],"fullName":"backfill-news-og-locale-alternate.ts whitespace preservation preserves 4-space leading indentation","status":"passed","title":"preserves 4-space leading indentation","duration":0.5065789999999879,"failureMessages":[],"location":{"line":104,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","whitespace preservation"],"fullName":"backfill-news-og-locale-alternate.ts whitespace preservation preserves zero leading indentation","status":"passed","title":"preserves zero leading indentation","duration":0.49300300000004427,"failureMessages":[],"location":{"line":114,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","idempotency on second pass"],"fullName":"backfill-news-og-locale-alternate.ts idempotency on second pass running the backfill twice produces the same result as running it once","status":"passed","title":"running the backfill twice produces the same result as running it once","duration":0.6863049999999475,"failureMessages":[],"location":{"line":126,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","locale lookup table completeness"],"fullName":"backfill-news-og-locale-alternate.ts locale lookup table completeness every supported language has a unique og:locale value","status":"passed","title":"every supported language has a unique og:locale value","duration":0.48703199999999924,"failureMessages":[],"location":{"line":137,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","locale lookup table completeness"],"fullName":"backfill-news-og-locale-alternate.ts locale lookup table completeness Norwegian uses BCP-47 nb_NO (Norwegian Bokmål)","status":"passed","title":"Norwegian uses BCP-47 nb_NO (Norwegian Bokmål)","duration":0.5550289999999904,"failureMessages":[],"location":{"line":142,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","locale lookup table completeness"],"fullName":"backfill-news-og-locale-alternate.ts locale lookup table completeness Chinese uses zh_CN","status":"passed","title":"Chinese uses zh_CN","duration":0.45207700000003115,"failureMessages":[],"location":{"line":147,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","locale lookup table completeness"],"fullName":"backfill-news-og-locale-alternate.ts locale lookup table completeness Arabic uses ar_SA","status":"passed","title":"Arabic uses ar_SA","duration":0.4601519999999937,"failureMessages":[],"location":{"line":151,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","non-canonical locale normalization"],"fullName":"backfill-news-og-locale-alternate.ts non-canonical locale normalization rewrites no_NO → nb_NO and injects 13 alternates","status":"passed","title":"rewrites no_NO → nb_NO and injects 13 alternates","duration":0.622175000000027,"failureMessages":[],"location":{"line":157,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","non-canonical locale normalization"],"fullName":"backfill-news-og-locale-alternate.ts non-canonical locale normalization rewrites en_GB → en_US and injects 13 alternates","status":"passed","title":"rewrites en_GB → en_US and injects 13 alternates","duration":0.6444869999999696,"failureMessages":[],"location":{"line":171,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","non-canonical locale normalization"],"fullName":"backfill-news-og-locale-alternate.ts non-canonical locale normalization does not flag canonical locales as normalized","status":"passed","title":"does not flag canonical locales as normalized","duration":0.5160060000000044,"failureMessages":[],"location":{"line":183,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["backfill-news-og-locale-alternate.ts","non-canonical locale normalization"],"fullName":"backfill-news-og-locale-alternate.ts non-canonical locale normalization normalization is idempotent on second pass","status":"passed","title":"normalization is idempotent on second pass","duration":0.5569830000000024,"failureMessages":[],"location":{"line":190,"column":5},"meta":{},"tags":[]}],"startTime":1787953841043,"endTime":1787953841068.557,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/backfill-news-og-locale-alternate.test.ts"},{"assertionResults":[{"ancestorTitles":["bake-stats-html"],"fullName":"bake-stats-html mirrors the browser stats-loader STAT_MAPPINGS exactly","status":"passed","title":"mirrors the browser stats-loader STAT_MAPPINGS exactly","duration":4.778137000000015,"failureMessages":[],"location":{"line":25,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["bake-stats-html"],"fullName":"bake-stats-html builds a lookup from a representative CSV slice","status":"passed","title":"builds a lookup from a representative CSV slice","duration":15.238623000000018,"failureMessages":[],"location":{"line":48,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["bake-stats-html"],"fullName":"bake-stats-html rewrites only the text content of matching stat spans","status":"passed","title":"rewrites only the text content of matching stat spans","duration":1.2333399999999983,"failureMessages":[],"location":{"line":71,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["bake-stats-html"],"fullName":"bake-stats-html is idempotent — re-baking concrete values is a no-op for those","status":"passed","title":"is idempotent — re-baking concrete values is a no-op for those","duration":0.5662090000000148,"failureMessages":[],"location":{"line":96,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["bake-stats-html"],"fullName":"bake-stats-html does not match across element boundaries","status":"passed","title":"does not match across element boundaries","duration":0.5614209999999957,"failureMessages":[],"location":{"line":104,"column":3},"meta":{},"tags":[]}],"startTime":1787953892752,"endTime":1787953892774.5662,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/bake-stats-html.test.ts"},{"assertionResults":[{"ancestorTitles":["extractBriefEntities — propositions fixture (English)"],"fullName":"extractBriefEntities — propositions fixture (English) mines all ten HD-prefixed bill IDs from the brief","status":"passed","title":"mines all ten HD-prefixed bill IDs from the brief","duration":4.36098400000003,"failureMessages":[],"location":{"line":61,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractBriefEntities — propositions fixture (English)"],"fullName":"extractBriefEntities — propositions fixture (English) mines committee codes only when they appear in parens or with report digits","status":"passed","title":"mines committee codes only when they appear in parens or with report digits","duration":0.6133580000000052,"failureMessages":[],"location":{"line":70,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractBriefEntities — propositions fixture (English)"],"fullName":"extractBriefEntities — propositions fixture (English) mines party codes only from parenthetical lists (gating against bare-word noise)","status":"passed","title":"mines party codes only from parenthetical lists (gating against bare-word noise)","duration":0.4680670000000191,"failureMessages":[],"location":{"line":76,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractBriefEntities — propositions fixture (English)"],"fullName":"extractBriefEntities — propositions fixture (English) does NOT include section-header prose words as named entities","status":"passed","title":"does NOT include section-header prose words as named entities","duration":1.4552140000000122,"failureMessages":[],"location":{"line":82,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractBriefEntities — propositions fixture (English)"],"fullName":"extractBriefEntities — propositions fixture (English) does NOT produce multiline-spanning named entities","status":"passed","title":"does NOT produce multiline-spanning named entities","duration":0.3544239999999945,"failureMessages":[],"location":{"line":91,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 60-Second Read"],"fullName":"extractHeadlineSection — 60-Second Read finds the 60-Second Read section and returns its bullet lines","status":"passed","title":"finds the 60-Second Read section and returns its bullet lines","duration":2.0579830000000356,"failureMessages":[],"location":{"line":100,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 60-Second Read"],"fullName":"extractHeadlineSection — 60-Second Read returns heading=null and empty bullets when no headline section is present","status":"passed","title":"returns heading=null and empty bullets when no headline section is present","duration":0.9795239999999694,"failureMessages":[],"location":{"line":108,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["flattenBriefEntities — editorial priority ordering"],"fullName":"flattenBriefEntities — editorial priority ordering puts bill IDs ahead of committee codes ahead of party codes","status":"passed","title":"puts bill IDs ahead of committee codes ahead of party codes","duration":0.9571819999999889,"failureMessages":[],"location":{"line":117,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractBriefEntities — empty / null safety"],"fullName":"extractBriefEntities — empty / null safety returns empty arrays for empty input","status":"passed","title":"returns empty arrays for empty input","duration":0.718373999999983,"failureMessages":[],"location":{"line":129,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractBriefEntities — empty / null safety"],"fullName":"extractBriefEntities — empty / null safety CJK locales (no Latin capitals) mine universal IDs only, no named entities","status":"passed","title":"CJK locales (no Latin capitals) mine universal IDs only, no named entities","duration":0.7037980000000061,"failureMessages":[],"location":{"line":137,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [sv] matches \"## ⚡ 60 sekunders läsning\"","status":"passed","title":"[sv] matches \"## ⚡ 60 sekunders läsning\"","duration":0.7413579999999911,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [sv] matches \"## ⚡ 60-sekunders underrättelsepunkter\"","status":"passed","title":"[sv] matches \"## ⚡ 60-sekunders underrättelsepunkter\"","duration":0.45688499999999976,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [da] matches \"## ⚡ 60 sekunders læsning\"","status":"passed","title":"[da] matches \"## ⚡ 60 sekunders læsning\"","duration":0.5007080000000315,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [da] matches \"## ⚡ 60 sekunders efterretningspunkter\"","status":"passed","title":"[da] matches \"## ⚡ 60 sekunders efterretningspunkter\"","duration":0.4397040000000061,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [no] matches \"## ⚡ 60 sekunders lesning\"","status":"passed","title":"[no] matches \"## ⚡ 60 sekunders lesning\"","duration":0.5269569999999817,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [no] matches \"## ⚡ 60 sekunders etterretningspunkter\"","status":"passed","title":"[no] matches \"## ⚡ 60 sekunders etterretningspunkter\"","duration":0.48721199999999953,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [fi] matches \"## ⚡ 60 sekunnin lukeminen\"","status":"passed","title":"[fi] matches \"## ⚡ 60 sekunnin lukeminen\"","duration":0.5807570000000055,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [fi] matches \"## ⚡ 60 sekunnin tiedustelutiivistelmä\"","status":"passed","title":"[fi] matches \"## ⚡ 60 sekunnin tiedustelutiivistelmä\"","duration":0.45064400000001115,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [de] matches \"## ⚡ 60 Sekunden-Lektüre\"","status":"passed","title":"[de] matches \"## ⚡ 60 Sekunden-Lektüre\"","duration":0.5120979999999804,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [de] matches \"## ⚡ 60-Sekunden nachrichtendienstliche Punkte\"","status":"passed","title":"[de] matches \"## ⚡ 60-Sekunden nachrichtendienstliche Punkte\"","duration":0.46501999999998134,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [fr] matches \"## ⚡ Lecture en 60 secondes\"","status":"passed","title":"[fr] matches \"## ⚡ Lecture en 60 secondes\"","duration":0.5651979999999526,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [fr] matches \"## ⚡ Points de renseignement en 60 secondes\"","status":"passed","title":"[fr] matches \"## ⚡ Points de renseignement en 60 secondes\"","duration":0.5515419999999835,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [es] matches \"## ⚡ Lectura de 60 segundos\"","status":"passed","title":"[es] matches \"## ⚡ Lectura de 60 segundos\"","duration":0.5465940000000273,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [es] matches \"## ⚡ Puntos de inteligencia en 60 segundos\"","status":"passed","title":"[es] matches \"## ⚡ Puntos de inteligencia en 60 segundos\"","duration":0.5289100000000531,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [nl] matches \"## ⚡ 60 seconden lezing\"","status":"passed","title":"[nl] matches \"## ⚡ 60 seconden lezing\"","duration":0.47998799999999164,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [nl] matches \"## ⚡ 60 seconden inlichtingenpunten\"","status":"passed","title":"[nl] matches \"## ⚡ 60 seconden inlichtingenpunten\"","duration":0.5569830000000024,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [ar] matches \"## ⚡ قراءة 60 ثانية\"","status":"passed","title":"[ar] matches \"## ⚡ قراءة 60 ثانية\"","duration":0.4718040000000201,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [ar] matches \"## ⚡ نقاط الاستخبارات في 60 ثانية\"","status":"passed","title":"[ar] matches \"## ⚡ نقاط الاستخبارات في 60 ثانية\"","duration":0.5688349999999787,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [he] matches \"## ⚡ קריאה של 60 שניות\"","status":"passed","title":"[he] matches \"## ⚡ קריאה של 60 שניות\"","duration":0.5227280000000292,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [he] matches \"## ⚡ נקודות מודיעין ב-60 שניות\"","status":"passed","title":"[he] matches \"## ⚡ נקודות מודיעין ב-60 שניות\"","duration":0.5603790000000117,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [ja] matches \"## ⚡ 60秒で読む\"","status":"passed","title":"[ja] matches \"## ⚡ 60秒で読む\"","duration":0.7570069999999873,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [ja] matches \"## ⚡ 60秒インテリジェンスポイント\"","status":"passed","title":"[ja] matches \"## ⚡ 60秒インテリジェンスポイント\"","duration":0.7537310000000161,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [ko] matches \"## ⚡ 60초 읽기\"","status":"passed","title":"[ko] matches \"## ⚡ 60초 읽기\"","duration":0.5786030000000437,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [ko] matches \"## ⚡ 60초 인텔리전스 포인트\"","status":"passed","title":"[ko] matches \"## ⚡ 60초 인텔리전스 포인트\"","duration":0.7881849999999986,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [zh] matches \"## ⚡ 60秒速读\"","status":"passed","title":"[zh] matches \"## ⚡ 60秒速读\"","duration":0.7499540000000025,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [zh] matches \"## ⚡ 60秒情报要点\"","status":"passed","title":"[zh] matches \"## ⚡ 60秒情报要点\"","duration":0.6311210000000074,"failureMessages":[],"location":{"line":186,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [en] EN dictionary still matches `60-Second Read` (regression guard)","status":"passed","title":"[en] EN dictionary still matches `60-Second Read` (regression guard)","duration":0.6771779999999694,"failureMessages":[],"location":{"line":210,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [es] numbered list bullets (1. 2. …) are collected from Lectura en 60 segundos","status":"passed","title":"[es] numbered list bullets (1. 2. …) are collected from Lectura en 60 segundos","duration":0.7929440000000341,"failureMessages":[],"location":{"line":224,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["extractHeadlineSection — 14-language headline dictionary (live corpus)"],"fullName":"extractHeadlineSection — 14-language headline dictionary (live corpus) [zh] numbered list bullets (1. 2. …) are collected from 60秒速读","status":"passed","title":"[zh] numbered list bullets (1. 2. …) are collected from 60秒速读","duration":0.6693829999999821,"failureMessages":[],"location":{"line":248,"column":3},"meta":{},"tags":[]}],"startTime":1787953821380,"endTime":1787953821410.6694,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/brief-extractor.test.ts"},{"assertionResults":[{"ancestorTitles":["brief-prefixes — dictionary coverage"],"fullName":"brief-prefixes — dictionary coverage contains entries for every supported language","status":"passed","title":"contains entries for every supported language","duration":4.634225000000015,"failureMessages":[],"location":{"line":28,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — dictionary coverage"],"fullName":"brief-prefixes — dictionary coverage every entry is a non-empty literal string","status":"passed","title":"every entry is a non-empty literal string","duration":9.295453000000009,"failureMessages":[],"location":{"line":35,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — regex caching"],"fullName":"brief-prefixes — regex caching returns the same RegExp instance across calls for the same language","status":"passed","title":"returns the same RegExp instance across calls for the same language","duration":1.1220799999999826,"failureMessages":[],"location":{"line":50,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — regex caching"],"fullName":"brief-prefixes — regex caching returns distinct compiled regexes for distinct languages","status":"passed","title":"returns distinct compiled regexes for distinct languages","duration":1.473228000000006,"failureMessages":[],"location":{"line":59,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — regex caching"],"fullName":"brief-prefixes — regex caching caches the result for every supported language","status":"passed","title":"caches the result for every supported language","duration":1.034877999999992,"failureMessages":[],"location":{"line":70,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — regex caching"],"fullName":"brief-prefixes — regex caching reset cache helper clears prior compilations","status":"passed","title":"reset cache helper clears prior compilations","duration":0.6208520000000135,"failureMessages":[],"location":{"line":80,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'en'","status":"passed","title":"strips the boilerplate prefix for 'en'","duration":0.7623570000000086,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'sv'","status":"passed","title":"strips the boilerplate prefix for 'sv'","duration":0.5962059999999951,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'da'","status":"passed","title":"strips the boilerplate prefix for 'da'","duration":0.7549439999999663,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'no'","status":"passed","title":"strips the boilerplate prefix for 'no'","duration":0.6708659999999895,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'fi'","status":"passed","title":"strips the boilerplate prefix for 'fi'","duration":0.6745329999999967,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'de'","status":"passed","title":"strips the boilerplate prefix for 'de'","duration":0.6369530000000054,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'fr'","status":"passed","title":"strips the boilerplate prefix for 'fr'","duration":0.586387000000002,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'es'","status":"passed","title":"strips the boilerplate prefix for 'es'","duration":0.5869490000000042,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'nl'","status":"passed","title":"strips the boilerplate prefix for 'nl'","duration":0.5882710000000202,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'ar'","status":"passed","title":"strips the boilerplate prefix for 'ar'","duration":0.5761090000000308,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'he'","status":"passed","title":"strips the boilerplate prefix for 'he'","duration":0.5792849999999703,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'ja'","status":"passed","title":"strips the boilerplate prefix for 'ja'","duration":0.5890029999999911,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'ko'","status":"passed","title":"strips the boilerplate prefix for 'ko'","duration":0.5832920000000286,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix strips the boilerplate prefix for 'zh'","status":"passed","title":"strips the boilerplate prefix for 'zh'","duration":0.5654789999999821,"failureMessages":[],"location":{"line":114,"column":19},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix returns the text unchanged when no prefix matches","status":"passed","title":"returns the text unchanged when no prefix matches","duration":0.8067199999999843,"failureMessages":[],"location":{"line":118,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix matches case-insensitively (UPPERCASE prefix)","status":"passed","title":"matches case-insensitively (UPPERCASE prefix)","duration":0.556933000000015,"failureMessages":[],"location":{"line":123,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — stripBriefPrefix"],"fullName":"brief-prefixes — stripBriefPrefix longer compound prefix wins over its shorter substring","status":"passed","title":"longer compound prefix wins over its shorter substring","duration":0.5618420000000128,"failureMessages":[],"location":{"line":128,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['sv'] strips corpus-observed prefix: 'Underrättelsebriefing — Sverige Antar…'","status":"passed","title":"['sv'] strips corpus-observed prefix: 'Underrättelsebriefing — Sverige Antar…'","duration":0.4384410000000116,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['sv'] strips corpus-observed prefix: 'Verkställande sammanfattning — Riksda…'","status":"passed","title":"['sv'] strips corpus-observed prefix: 'Verkställande sammanfattning — Riksda…'","duration":0.4580680000000257,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['sv'] strips corpus-observed prefix: 'Kortanalys — Budgetproposition 2026'","status":"passed","title":"['sv'] strips corpus-observed prefix: 'Kortanalys — Budgetproposition 2026'","duration":0.38522100000000137,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['da'] strips corpus-observed prefix: 'Efterretningsbriefing — Parlamentsval…'","status":"passed","title":"['da'] strips corpus-observed prefix: 'Efterretningsbriefing — Parlamentsval…'","duration":0.5031020000000126,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['da'] strips corpus-observed prefix: 'Eksekutiv resumé — Parlamentet Vedtag…'","status":"passed","title":"['da'] strips corpus-observed prefix: 'Eksekutiv resumé — Parlamentet Vedtag…'","duration":0.43726799999996047,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['no'] strips corpus-observed prefix: 'Etterretningsbriefing — Stortingets V…'","status":"passed","title":"['no'] strips corpus-observed prefix: 'Etterretningsbriefing — Stortingets V…'","duration":0.46711399999998093,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['no'] strips corpus-observed prefix: 'Ledersammendrag — Ny Migrasjonslov Ve…'","status":"passed","title":"['no'] strips corpus-observed prefix: 'Ledersammendrag — Ny Migrasjonslov Ve…'","duration":0.4574060000000486,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['fi'] strips corpus-observed prefix: 'Johtoryhmän tiivistelmä — Eduskunta H…'","status":"passed","title":"['fi'] strips corpus-observed prefix: 'Johtoryhmän tiivistelmä — Eduskunta H…'","duration":0.5632039999999847,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['fi'] strips corpus-observed prefix: 'Johdon tiivistelmä — Budjettiesitys 2…'","status":"passed","title":"['fi'] strips corpus-observed prefix: 'Johdon tiivistelmä — Budjettiesitys 2…'","duration":0.5395809999999983,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['de'] strips corpus-observed prefix: 'Exekutivzusammenfassung — Bundestag V…'","status":"passed","title":"['de'] strips corpus-observed prefix: 'Exekutivzusammenfassung — Bundestag V…'","duration":0.5616110000000276,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['de'] strips corpus-observed prefix: 'Kurzanalyse — Migrationspolitik 2026'","status":"passed","title":"['de'] strips corpus-observed prefix: 'Kurzanalyse — Migrationspolitik 2026'","duration":0.4837259999999901,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['fr'] strips corpus-observed prefix: 'Synthèse — Le Parlement Suédois Vote …'","status":"passed","title":"['fr'] strips corpus-observed prefix: 'Synthèse — Le Parlement Suédois Vote …'","duration":0.5481059999999616,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['fr'] strips corpus-observed prefix: 'Note de synthèse exécutive — Réforme …'","status":"passed","title":"['fr'] strips corpus-observed prefix: 'Note de synthèse exécutive — Réforme …'","duration":2.10706399999998,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['es'] strips corpus-observed prefix: 'Nota ejecutiva — El Parlamento Sueco …'","status":"passed","title":"['es'] strips corpus-observed prefix: 'Nota ejecutiva — El Parlamento Sueco …'","duration":0.4381999999999948,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['nl'] strips corpus-observed prefix: 'Uitvoerende samenvatting — Het Zweeds…'","status":"passed","title":"['nl'] strips corpus-observed prefix: 'Uitvoerende samenvatting — Het Zweeds…'","duration":0.5739049999999679,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['nl'] strips corpus-observed prefix: 'Managementsamenvatting — Migratieherv…'","status":"passed","title":"['nl'] strips corpus-observed prefix: 'Managementsamenvatting — Migratieherv…'","duration":0.37720600000000104,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['ar'] strips corpus-observed prefix: 'الملخص التنفيذي — البرلمان السويدي يص…'","status":"passed","title":"['ar'] strips corpus-observed prefix: 'الملخص التنفيذي — البرلمان السويدي يص…'","duration":0.4428490000000238,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['ar'] strips corpus-observed prefix: 'إحاطة استخباراتية — تصويت مهم في البر…'","status":"passed","title":"['ar'] strips corpus-observed prefix: 'إحاطة استخباراتية — تصويت مهم في البر…'","duration":0.38567199999999957,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['he'] strips corpus-observed prefix: 'סיכום מנהלים — הפרלמנט השוודי מצביע ע…'","status":"passed","title":"['he'] strips corpus-observed prefix: 'סיכום מנהלים — הפרלמנט השוודי מצביע ע…'","duration":0.6533129999999687,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['he'] strips corpus-observed prefix: 'תדריך מנהלים — חקיקה חדשה בשוודיה'","status":"passed","title":"['he'] strips corpus-observed prefix: 'תדריך מנהלים — חקיקה חדשה בשוודיה'","duration":0.4191240000000107,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['ja'] strips corpus-observed prefix: '情報ブリーフィング — スウェーデン議会が移民改革を可決'","status":"passed","title":"['ja'] strips corpus-observed prefix: '情報ブリーフィング — スウェーデン議会が移民改革を可決'","duration":0.5054569999999785,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['ja'] strips corpus-observed prefix: 'インテリジェンスブリーフィング — 重要な立法決定'","status":"passed","title":"['ja'] strips corpus-observed prefix: 'インテリジェンスブリーフィング — 重要な立法決定'","duration":0.42273099999999886,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['ko'] strips corpus-observed prefix: '집행 브리핑 — 스웨덴 의회가 이민법을 통과'","status":"passed","title":"['ko'] strips corpus-observed prefix: '집행 브리핑 — 스웨덴 의회가 이민법을 통과'","duration":0.5130100000000084,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['ko'] strips corpus-observed prefix: '임원 브리핑 — 중요한 입법 결정'","status":"passed","title":"['ko'] strips corpus-observed prefix: '임원 브리핑 — 중요한 입법 결정'","duration":0.4402340000000322,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['zh'] strips corpus-observed prefix: '执行简报 — 瑞典议会通过移民改革法案'","status":"passed","title":"['zh'] strips corpus-observed prefix: '执行简报 — 瑞典议会通过移民改革法案'","duration":0.55072100000001,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]},{"ancestorTitles":["brief-prefixes — corpus-observed additions (2026-05)"],"fullName":"brief-prefixes — corpus-observed additions (2026-05) ['zh'] strips corpus-observed prefix: '行政简报 — 重要立法决定'","status":"passed","title":"['zh'] strips corpus-observed prefix: '行政简报 — 重要立法决定'","duration":0.6747529999999529,"failureMessages":[],"location":{"line":183,"column":28},"meta":{},"tags":[]}],"startTime":1787953825866,"endTime":1787953825910.6748,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/brief-prefixes.test.ts"},{"assertionResults":[{"ancestorTitles":["Shared data-loader cache eviction (production paths)"],"fullName":"Shared data-loader cache eviction (production paths) should store data via loadText and cache under the module prefix","status":"passed","title":"should store data via loadText and cache under the module prefix","duration":7.059045999999967,"failureMessages":[],"location":{"line":93,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Shared data-loader cache eviction (production paths)"],"fullName":"Shared data-loader cache eviction (production paths) should evict only prefixed entries on QuotaExceededError and retry","status":"passed","title":"should evict only prefixed entries on QuotaExceededError and retry","duration":1.2941730000000007,"failureMessages":[],"location":{"line":118,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Shared data-loader cache eviction (production paths)"],"fullName":"Shared data-loader cache eviction (production paths) should NOT evict on SecurityError (storage disabled)","status":"passed","title":"should NOT evict on SecurityError (storage disabled)","duration":0.8748580000000175,"failureMessages":[],"location":{"line":153,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Election-cycle cache eviction"],"fullName":"Election-cycle cache eviction should evict only election-cycle entries on QuotaExceededError","status":"passed","title":"should evict only election-cycle entries on QuotaExceededError","duration":29.696957999999995,"failureMessages":[],"location":{"line":203,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Election-cycle cache eviction"],"fullName":"Election-cycle cache eviction should NOT evict on SecurityError (storage disabled)","status":"passed","title":"should NOT evict on SecurityError (storage disabled)","duration":0.9248010000000022,"failureMessages":[],"location":{"line":242,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Shared data-loader eviction strategy"],"fullName":"Shared data-loader eviction strategy should evict oldest half of PREFIXED cache entries by timestamp","status":"passed","title":"should evict oldest half of PREFIXED cache entries by timestamp","duration":0.815477000000044,"failureMessages":[],"location":{"line":270,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Shared data-loader eviction strategy"],"fullName":"Shared data-loader eviction strategy should evict at least one entry even when only one exists","status":"passed","title":"should evict at least one entry even when only one exists","duration":0.5361039999999662,"failureMessages":[],"location":{"line":304,"column":3},"meta":{},"tags":[]}],"startTime":1787953821839,"endTime":1787953821881.5361,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cache-eviction.test.ts"},{"assertionResults":[{"ancestorTitles":["calendar-fetch"],"fullName":"calendar-fetch emits normalized calendar status for an org-scoped fetch","status":"passed","title":"emits normalized calendar status for an org-scoped fetch","duration":4.6064250000000015,"failureMessages":[],"location":{"line":6,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["calendar-fetch"],"fullName":"calendar-fetch captures fetch errors without throwing","status":"passed","title":"captures fetch errors without throwing","duration":0.8539490000000001,"failureMessages":[],"location":{"line":27,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["calendar-fetch"],"fullName":"calendar-fetch filters scoped events in injected MCP client mode","status":"passed","title":"filters scoped events in injected MCP client mode","duration":1.5381800000000112,"failureMessages":[],"location":{"line":38,"column":3},"meta":{},"tags":[]}],"startTime":1787953927437,"endTime":1787953927444.538,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/calendar-fetch.test.ts"},{"assertionResults":[{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data returns empty catalog for empty data root","status":"passed","title":"returns empty catalog for empty data root","duration":5.826740000000029,"failureMessages":[],"location":{"line":32,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data catalogs proposition files","status":"passed","title":"catalogs proposition files","duration":3.0100360000000137,"failureMessages":[],"location":{"line":41,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data detects existing analysis files","status":"passed","title":"detects existing analysis files","duration":1.1235829999999964,"failureMessages":[],"location":{"line":61,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data filters by type","status":"passed","title":"filters by type","duration":0.9581029999999942,"failureMessages":[],"location":{"line":78,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data filters pending-only","status":"passed","title":"filters pending-only","duration":1.58680099999998,"failureMessages":[],"location":{"line":88,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data excludes .meta.json files from entries","status":"passed","title":"excludes .meta.json files from entries","duration":1.230673999999965,"failureMessages":[],"location":{"line":107,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data handles nested date directories (votes/YYYY-MM-DD/)","status":"passed","title":"handles nested date directories (votes/YYYY-MM-DD/)","duration":1.0750229999999874,"failureMessages":[],"location":{"line":118,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data catalogs documents/votes/ for votes without valid datum","status":"passed","title":"catalogs documents/votes/ for votes without valid datum","duration":0.9271160000000123,"failureMessages":[],"location":{"line":130,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data deduplicates votes appearing in both documents/votes and votes/YYYY-MM-DD","status":"passed","title":"deduplicates votes appearing in both documents/votes and votes/YYYY-MM-DD","duration":1.701755999999989,"failureMessages":[],"location":{"line":142,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data handles malformed meta.json gracefully","status":"passed","title":"handles malformed meta.json gracefully","duration":1.052129999999977,"failureMessages":[],"location":{"line":159,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data records file size","status":"passed","title":"records file size","duration":0.9450300000000311,"failureMessages":[],"location":{"line":172,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data catalogs multiple types at once","status":"passed","title":"catalogs multiple types at once","duration":1.8551740000000336,"failureMessages":[],"location":{"line":185,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data generates analysis paths alongside data files","status":"passed","title":"generates analysis paths alongside data files","duration":0.8624250000000302,"failureMessages":[],"location":{"line":203,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["catalog-downloaded-data"],"fullName":"catalog-downloaded-data handles nested type subdirectories with duplicate basenames","status":"passed","title":"handles nested type subdirectories with duplicate basenames","duration":1.1649610000000052,"failureMessages":[],"location":{"line":212,"column":3},"meta":{},"tags":[]}],"startTime":1787953840090,"endTime":1787953840114.165,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/catalog-downloaded-data.test.ts"},{"assertionResults":[{"ancestorTitles":["chart-init — defense-in-depth"],"fullName":"chart-init — defense-in-depth parses a valid JSON config and instantiates Chart.js","status":"passed","title":"parses a valid JSON config and instantiates Chart.js","duration":6.351392000000033,"failureMessages":[],"location":{"line":74,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chart-init — defense-in-depth"],"fullName":"chart-init — defense-in-depth rejects configs whose raw attribute contains a function literal","status":"passed","title":"rejects configs whose raw attribute contains a function literal","duration":2.628130999999996,"failureMessages":[],"location":{"line":84,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chart-init — defense-in-depth"],"fullName":"chart-init — defense-in-depth rejects configs with function literal and additional whitespace variants","status":"passed","title":"rejects configs with function literal and additional whitespace variants","duration":1.7953520000000367,"failureMessages":[],"location":{"line":94,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chart-init — defense-in-depth"],"fullName":"chart-init — defense-in-depth ignores canvases with missing or malformed data-chart-config","status":"passed","title":"ignores canvases with missing or malformed data-chart-config","duration":1.958517000000029,"failureMessages":[],"location":{"line":101,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chart-init — prefers-reduced-motion"],"fullName":"chart-init — prefers-reduced-motion disables animation on parsed config when user prefers reduced motion","status":"passed","title":"disables animation on parsed config when user prefers reduced motion","duration":1.1144370000000094,"failureMessages":[],"location":{"line":110,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chart-init — prefers-reduced-motion"],"fullName":"chart-init — prefers-reduced-motion preserves original animation settings when user has no reduced-motion preference","status":"passed","title":"preserves original animation settings when user has no reduced-motion preference","duration":1.7825179999999818,"failureMessages":[],"location":{"line":121,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chart-init — prefers-reduced-motion"],"fullName":"chart-init — prefers-reduced-motion clears animations/transitions objects when reduced-motion is requested","status":"passed","title":"clears animations/transitions objects when reduced-motion is requested","duration":1.1174330000000054,"failureMessages":[],"location":{"line":131,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chart-init — prefers-reduced-motion"],"fullName":"chart-init — prefers-reduced-motion handles configs without an options field gracefully","status":"passed","title":"handles configs without an options field gracefully","duration":0.9944409999999948,"failureMessages":[],"location":{"line":146,"column":3},"meta":{},"tags":[]}],"startTime":1787953891344,"endTime":1787953891361.9944,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/chart-init.test.js"},{"assertionResults":[{"ancestorTitles":["check-analysis-language","stripMarkdownCodeAndFrontmatter"],"fullName":"check-analysis-language stripMarkdownCodeAndFrontmatter removes YAML frontmatter","status":"passed","title":"removes YAML frontmatter","duration":4.196146999999996,"failureMessages":[],"location":{"line":22,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","stripMarkdownCodeAndFrontmatter"],"fullName":"check-analysis-language stripMarkdownCodeAndFrontmatter removes code fences","status":"passed","title":"removes code fences","duration":0.6243590000000268,"failureMessages":[],"location":{"line":29,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","stripMarkdownCodeAndFrontmatter"],"fullName":"check-analysis-language stripMarkdownCodeAndFrontmatter removes inline code","status":"passed","title":"removes inline code","duration":0.5379970000000185,"failureMessages":[],"location":{"line":37,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","stripMarkdownCodeAndFrontmatter"],"fullName":"check-analysis-language stripMarkdownCodeAndFrontmatter does NOT strip body text between two `---` thematic breaks (regression: regex `/m` flag)","status":"passed","title":"does NOT strip body text between two `---` thematic breaks (regression: regex `/m` flag)","duration":0.4752700000000232,"failureMessages":[],"location":{"line":45,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","tokenizeWords"],"fullName":"check-analysis-language tokenizeWords extracts lowercase words","status":"passed","title":"extracts lowercase words","duration":1.224232000000029,"failureMessages":[],"location":{"line":72,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","tokenizeWords"],"fullName":"check-analysis-language tokenizeWords handles Swedish characters","status":"passed","title":"handles Swedish characters","duration":1.2156049999999823,"failureMessages":[],"location":{"line":78,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","tokenizeWords"],"fullName":"check-analysis-language tokenizeWords returns empty array for no words","status":"passed","title":"returns empty array for no words","duration":0.5244519999999966,"failureMessages":[],"location":{"line":86,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","calculateSwedishDensity"],"fullName":"check-analysis-language calculateSwedishDensity detects 100% English content","status":"passed","title":"detects 100% English content","duration":1.0215929999999958,"failureMessages":[],"location":{"line":105,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","calculateSwedishDensity"],"fullName":"check-analysis-language calculateSwedishDensity detects heavily Swedish content","status":"passed","title":"detects heavily Swedish content","duration":1.03751299999999,"failureMessages":[],"location":{"line":114,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","calculateSwedishDensity"],"fullName":"check-analysis-language calculateSwedishDensity handles empty file","status":"passed","title":"handles empty file","duration":0.5556199999999762,"failureMessages":[],"location":{"line":130,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","findAnalysisMarkdownFiles"],"fullName":"check-analysis-language findAnalysisMarkdownFiles finds regular markdown files","status":"passed","title":"finds regular markdown files","duration":1.6742750000000228,"failureMessages":[],"location":{"line":152,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","findAnalysisMarkdownFiles"],"fullName":"check-analysis-language findAnalysisMarkdownFiles excludes executive-brief_.md files","status":"passed","title":"excludes executive-brief_.md files","duration":0.8748580000000175,"failureMessages":[],"location":{"line":162,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","findAnalysisMarkdownFiles"],"fullName":"check-analysis-language findAnalysisMarkdownFiles excludes pass1/ subdirectories","status":"passed","title":"excludes pass1/ subdirectories","duration":0.7861619999999903,"failureMessages":[],"location":{"line":174,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","findAnalysisMarkdownFiles"],"fullName":"check-analysis-language findAnalysisMarkdownFiles excludes data-download-manifest.md","status":"passed","title":"excludes data-download-manifest.md","duration":0.6283060000000091,"failureMessages":[],"location":{"line":185,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","findAnalysisMarkdownFiles"],"fullName":"check-analysis-language findAnalysisMarkdownFiles excludes full-text/ subdirectories (raw downloaded Swedish source material)","status":"passed","title":"excludes full-text/ subdirectories (raw downloaded Swedish source material)","duration":0.8219190000000367,"failureMessages":[],"location":{"line":194,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","validateAnalysisLanguage"],"fullName":"check-analysis-language validateAnalysisLanguage passes for all-English artifacts","status":"passed","title":"passes for all-English artifacts","duration":0.9146420000000148,"failureMessages":[],"location":{"line":219,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","validateAnalysisLanguage"],"fullName":"check-analysis-language validateAnalysisLanguage detects Swedish violations","status":"passed","title":"detects Swedish violations","duration":0.7239959999999996,"failureMessages":[],"location":{"line":229,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","validateAnalysisLanguage"],"fullName":"check-analysis-language validateAnalysisLanguage always exempts executive-brief_sv.md","status":"passed","title":"always exempts executive-brief_sv.md","duration":0.6741719999999987,"failureMessages":[],"location":{"line":247,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","validateAnalysisLanguage"],"fullName":"check-analysis-language validateAnalysisLanguage skips short snippets with few Swedish words","status":"passed","title":"skips short snippets with few Swedish words","duration":0.7241960000000063,"failureMessages":[],"location":{"line":266,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","validateAnalysisLanguage"],"fullName":"check-analysis-language validateAnalysisLanguage ignores Swedish prose inside blockquote-attributed source quotations","status":"passed","title":"ignores Swedish prose inside blockquote-attributed source quotations","duration":0.8076020000000312,"failureMessages":[],"location":{"line":275,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","validateAnalysisLanguage"],"fullName":"check-analysis-language validateAnalysisLanguage ignores verbatim Swedish source-title lines","status":"passed","title":"ignores verbatim Swedish source-title lines","duration":0.9434760000000324,"failureMessages":[],"location":{"line":297,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["check-analysis-language","validateAnalysisLanguage"],"fullName":"check-analysis-language validateAnalysisLanguage does NOT exempt bare `Title:` lines (only explicit source-attribution labels are exempted)","status":"passed","title":"does NOT exempt bare `Title:` lines (only explicit source-attribution labels are exempted)","duration":0.8353239999999573,"failureMessages":[],"location":{"line":318,"column":5},"meta":{},"tags":[]}],"startTime":1787953794789,"endTime":1787953794811.8352,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/check-analysis-language.test.ts"},{"assertionResults":[{"ancestorTitles":["check-brief-language — ENGLISH_MARKERS"],"fullName":"check-brief-language — ENGLISH_MARKERS contains unambiguous English function words","status":"passed","title":"contains unambiguous English function words","duration":3.8804870000000165,"failureMessages":[],"location":{"line":24,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — ENGLISH_MARKERS"],"fullName":"check-brief-language — ENGLISH_MARKERS excludes short ambiguous tokens that could appear in other languages","status":"passed","title":"excludes short ambiguous tokens that could appear in other languages","duration":0.6575010000000248,"failureMessages":[],"location":{"line":30,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — calculateEnglishDensity"],"fullName":"check-brief-language — calculateEnglishDensity returns zero density for a Swedish brief","status":"passed","title":"returns zero density for a Swedish brief","duration":1.0335150000000226,"failureMessages":[],"location":{"line":38,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — calculateEnglishDensity"],"fullName":"check-brief-language — calculateEnglishDensity detects high density when English fallback leaked into _sv.md","status":"passed","title":"detects high density when English fallback leaked into _sv.md","duration":0.724377000000004,"failureMessages":[],"location":{"line":54,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — calculateEnglishDensity"],"fullName":"check-brief-language — calculateEnglishDensity strips fenced code blocks before measuring","status":"passed","title":"strips fenced code blocks before measuring","duration":0.41940599999998085,"failureMessages":[],"location":{"line":67,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — calculateEnglishDensity"],"fullName":"check-brief-language — calculateEnglishDensity strips Markdown blockquote lines (attributed source quotations)","status":"passed","title":"strips Markdown blockquote lines (attributed source quotations)","duration":0.49623900000000276,"failureMessages":[],"location":{"line":84,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — exceedsEnglishThreshold"],"fullName":"check-brief-language — exceedsEnglishThreshold returns false when absolute marker count is below the floor","status":"passed","title":"returns false when absolute marker count is below the floor","duration":0.43036599999999225,"failureMessages":[],"location":{"line":102,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — exceedsEnglishThreshold"],"fullName":"check-brief-language — exceedsEnglishThreshold returns true when density exceeds 5% on Latin targets","status":"passed","title":"returns true when density exceeds 5% on Latin targets","duration":0.5258450000000039,"failureMessages":[],"location":{"line":106,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — exceedsEnglishThreshold"],"fullName":"check-brief-language — exceedsEnglishThreshold uses a tighter 3% threshold for CJK targets","status":"passed","title":"uses a tighter 3% threshold for CJK targets","duration":0.6747540000000072,"failureMessages":[],"location":{"line":112,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — exceedsEnglishThreshold"],"fullName":"check-brief-language — exceedsEnglishThreshold uses a tighter 2% threshold for RTL targets (ar, he)","status":"passed","title":"uses a tighter 2% threshold for RTL targets (ar, he)","duration":0.4585379999999759,"failureMessages":[],"location":{"line":118,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — exceedsEnglishThreshold"],"fullName":"check-brief-language — exceedsEnglishThreshold returns false at exactly the threshold (strict >)","status":"passed","title":"returns false at exactly the threshold (strict >)","duration":0.4763719999999694,"failureMessages":[],"location":{"line":126,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — findTranslatedBriefs + validateBriefLanguages"],"fullName":"check-brief-language — findTranslatedBriefs + validateBriefLanguages finds executive-brief_.md files and skips the English source","status":"passed","title":"finds executive-brief_.md files and skips the English source","duration":2.175845000000038,"failureMessages":[],"location":{"line":151,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — findTranslatedBriefs + validateBriefLanguages"],"fullName":"check-brief-language — findTranslatedBriefs + validateBriefLanguages skips pass1/ and full-text/ subdirectories","status":"passed","title":"skips pass1/ and full-text/ subdirectories","duration":1.772718999999995,"failureMessages":[],"location":{"line":163,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — findTranslatedBriefs + validateBriefLanguages"],"fullName":"check-brief-language — findTranslatedBriefs + validateBriefLanguages flags an English-fallback leak in _sv.md","status":"passed","title":"flags an English-fallback leak in _sv.md","duration":1.1059609999999793,"failureMessages":[],"location":{"line":173,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — findTranslatedBriefs + validateBriefLanguages"],"fullName":"check-brief-language — findTranslatedBriefs + validateBriefLanguages passes a genuine Swedish translation","status":"passed","title":"passes a genuine Swedish translation","duration":0.7721059999999511,"failureMessages":[],"location":{"line":191,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — findTranslatedBriefs + validateBriefLanguages"],"fullName":"check-brief-language — findTranslatedBriefs + validateBriefLanguages formats the violation report with relpath, lang, and density","status":"passed","title":"formats the violation report with relpath, lang, and density","duration":1.0951309999999808,"failureMessages":[],"location":{"line":207,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-brief-language — findTranslatedBriefs + validateBriefLanguages"],"fullName":"check-brief-language — findTranslatedBriefs + validateBriefLanguages returns empty report when no violations","status":"passed","title":"returns empty report when no violations","duration":0.47244499999999334,"failureMessages":[],"location":{"line":224,"column":3},"meta":{},"tags":[]}],"startTime":1787953833458,"endTime":1787953833476.4724,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/check-brief-language.test.ts"},{"assertionResults":[{"ancestorTitles":["check-headline-quality — extractH1"],"fullName":"check-headline-quality — extractH1 returns the first H1 after stripping YAML frontmatter","status":"passed","title":"returns the first H1 after stripping YAML frontmatter","duration":3.9386760000000436,"failureMessages":[],"location":{"line":26,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — extractH1"],"fullName":"check-headline-quality — extractH1 returns null when there is no H1","status":"passed","title":"returns null when there is no H1","duration":0.6710269999999809,"failureMessages":[],"location":{"line":33,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — extractH1"],"fullName":"check-headline-quality — extractH1 does not treat a body `---` thematic break as frontmatter","status":"passed","title":"does not treat a body `---` thematic break as frontmatter","duration":0.42947400000002744,"failureMessages":[],"location":{"line":37,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — extractH1"],"fullName":"check-headline-quality — extractH1 strips trailing whitespace from the H1","status":"passed","title":"strips trailing whitespace from the H1","duration":0.3690000000000282,"failureMessages":[],"location":{"line":42,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule A (Swedish-in-EN H1)"],"fullName":"check-headline-quality — Rule A (Swedish-in-EN H1) flags definite-form party names","status":"passed","title":"flags definite-form party names","duration":1.2374070000000188,"failureMessages":[],"location":{"line":48,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule A (Swedish-in-EN H1)"],"fullName":"check-headline-quality — Rule A (Swedish-in-EN H1) flags Tidö-coalition Swedish slugs","status":"passed","title":"flags Tidö-coalition Swedish slugs","duration":0.46458999999998696,"failureMessages":[],"location":{"line":56,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule A (Swedish-in-EN H1)"],"fullName":"check-headline-quality — Rule A (Swedish-in-EN H1) flags untranslated political nouns","status":"passed","title":"flags untranslated political nouns","duration":0.4044579999999769,"failureMessages":[],"location":{"line":60,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule A (Swedish-in-EN H1)"],"fullName":"check-headline-quality — Rule A (Swedish-in-EN H1) does NOT flag Riksdag / Regeringen — convention loans allowed in EN prose","status":"passed","title":"does NOT flag Riksdag / Regeringen — convention loans allowed in EN prose","duration":0.4804600000000505,"failureMessages":[],"location":{"line":67,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule A (Swedish-in-EN H1)"],"fullName":"check-headline-quality — Rule A (Swedish-in-EN H1) does NOT flag English party-name forms","status":"passed","title":"does NOT flag English party-name forms","duration":0.4739270000000033,"failureMessages":[],"location":{"line":71,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule A (Swedish-in-EN H1)"],"fullName":"check-headline-quality — Rule A (Swedish-in-EN H1) does NOT flag bill / proposition IDs that contain digits","status":"passed","title":"does NOT flag bill / proposition IDs that contain digits","duration":0.48418600000002243,"failureMessages":[],"location":{"line":75,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule B (weekday-date prefix)"],"fullName":"check-headline-quality — Rule B (weekday-date prefix) flags full weekday + day + month + year prefix","status":"passed","title":"flags full weekday + day + month + year prefix","duration":1.2063190000000077,"failureMessages":[],"location":{"line":81,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule B (weekday-date prefix)"],"fullName":"check-headline-quality — Rule B (weekday-date prefix) flags abbreviated weekday + month prefix","status":"passed","title":"flags abbreviated weekday + month prefix","duration":0.5284889999999791,"failureMessages":[],"location":{"line":86,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule B (weekday-date prefix)"],"fullName":"check-headline-quality — Rule B (weekday-date prefix) does NOT flag headlines that merely start with a weekday word (no date)","status":"passed","title":"does NOT flag headlines that merely start with a weekday word (no date)","duration":0.4755599999999731,"failureMessages":[],"location":{"line":90,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule B (weekday-date prefix)"],"fullName":"check-headline-quality — Rule B (weekday-date prefix) does NOT flag mid-sentence weekday references","status":"passed","title":"does NOT flag mid-sentence weekday references","duration":0.42673899999999776,"failureMessages":[],"location":{"line":95,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule C (ISO-date affix)"],"fullName":"check-headline-quality — Rule C (ISO-date affix) flags ISO date at the start","status":"passed","title":"flags ISO date at the start","duration":0.5747860000000173,"failureMessages":[],"location":{"line":101,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule C (ISO-date affix)"],"fullName":"check-headline-quality — Rule C (ISO-date affix) flags ISO date at the end after a separator","status":"passed","title":"flags ISO date at the end after a separator","duration":0.6929569999999785,"failureMessages":[],"location":{"line":105,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule C (ISO-date affix)"],"fullName":"check-headline-quality — Rule C (ISO-date affix) does NOT flag mid-sentence ISO dates","status":"passed","title":"does NOT flag mid-sentence ISO dates","duration":0.48357600000002776,"failureMessages":[],"location":{"line":110,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule D (boilerplate prefix)"],"fullName":"check-headline-quality — Rule D (boilerplate prefix) flags Executive Brief — prefix with leading emoji","status":"passed","title":"flags Executive Brief — prefix with leading emoji","duration":1.1108010000000377,"failureMessages":[],"location":{"line":118,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule D (boilerplate prefix)"],"fullName":"check-headline-quality — Rule D (boilerplate prefix) flags Realtime Monitor — prefix","status":"passed","title":"flags Realtime Monitor — prefix","duration":0.5085219999999708,"failureMessages":[],"location":{"line":125,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule D (boilerplate prefix)"],"fullName":"check-headline-quality — Rule D (boilerplate prefix) flags Pass 2 and Methodology Reflection scaffolding","status":"passed","title":"flags Pass 2 and Methodology Reflection scaffolding","duration":0.7700219999999831,"failureMessages":[],"location":{"line":129,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule D (boilerplate prefix)"],"fullName":"check-headline-quality — Rule D (boilerplate prefix) does NOT flag headlines that mention \"brief\" mid-sentence","status":"passed","title":"does NOT flag headlines that mention \"brief\" mid-sentence","duration":0.47951799999998457,"failureMessages":[],"location":{"line":134,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) flags bare leaf-label H1 for shallow subfolder","status":"passed","title":"flags bare leaf-label H1 for shallow subfolder","duration":1.3239300000000185,"failureMessages":[],"location":{"line":140,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) flags full-path H1 for nested subfolder","status":"passed","title":"flags full-path H1 for nested subfolder","duration":0.6071769999999788,"failureMessages":[],"location":{"line":145,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) ignores trailing/leading whitespace and punctuation when matching","status":"passed","title":"ignores trailing/leading whitespace and punctuation when matching","duration":1.3073380000000157,"failureMessages":[],"location":{"line":150,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) does NOT flag a real actor+verb headline that mentions the category word","status":"passed","title":"does NOT flag a real actor+verb headline that mentions the category word","duration":0.7765640000000076,"failureMessages":[],"location":{"line":157,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) returns false when subfolder is missing","status":"passed","title":"returns false when subfolder is missing","duration":0.5735029999999597,"failureMessages":[],"location":{"line":166,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) prettifies multi-segment subfolder paths via space-join","status":"passed","title":"prettifies multi-segment subfolder paths via space-join","duration":0.5129200000000083,"failureMessages":[],"location":{"line":171,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) normaliseHeadlineForCompare strips punctuation and lowercases","status":"passed","title":"normaliseHeadlineForCompare strips punctuation and lowercases","duration":0.561540999999977,"failureMessages":[],"location":{"line":176,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) subfolderFromBriefPath extracts subfolder relative to analysis/daily/","status":"passed","title":"subfolderFromBriefPath extracts subfolder relative to analysis/daily/","duration":0.7465880000000311,"failureMessages":[],"location":{"line":180,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) subfolderFromBriefPath returns null for non-canonical paths","status":"passed","title":"subfolderFromBriefPath returns null for non-canonical paths","duration":0.5697759999999903,"failureMessages":[],"location":{"line":190,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) validateH1 wires Rule E with subfolder argument","status":"passed","title":"validateH1 wires Rule E with subfolder argument","duration":1.7460399999999936,"failureMessages":[],"location":{"line":195,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — Rule E (H1 equals prettified subfolder)"],"fullName":"check-headline-quality — Rule E (H1 equals prettified subfolder) validateH1 does not fire Rule E when subfolder is omitted","status":"passed","title":"validateH1 does not fire Rule E when subfolder is omitted","duration":0.5913869999999974,"failureMessages":[],"location":{"line":202,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — validateH1 (integration)"],"fullName":"check-headline-quality — validateH1 (integration) returns empty array for a clean editorial headline","status":"passed","title":"returns empty array for a clean editorial headline","duration":0.6557180000000358,"failureMessages":[],"location":{"line":208,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — validateH1 (integration)"],"fullName":"check-headline-quality — validateH1 (integration) returns multiple issues when several rules fire","status":"passed","title":"returns multiple issues when several rules fire","duration":0.7528599999999983,"failureMessages":[],"location":{"line":212,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — validateH1 (integration)"],"fullName":"check-headline-quality — validateH1 (integration) flags weekday-date-prefix + scaffolding combination","status":"passed","title":"flags weekday-date-prefix + scaffolding combination","duration":0.6986780000000294,"failureMessages":[],"location":{"line":223,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-headline-quality — validateH1 (integration)"],"fullName":"check-headline-quality — validateH1 (integration) passes a real editorial headline from the repository","status":"passed","title":"passes a real editorial headline from the repository","duration":0.5759090000000242,"failureMessages":[],"location":{"line":229,"column":3},"meta":{},"tags":[]}],"startTime":1787953827825,"endTime":1787953827854.576,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/check-headline-quality.test.ts"},{"assertionResults":[{"ancestorTitles":["check-pat-fallback-coverage.mjs"],"fullName":"check-pat-fallback-coverage.mjs passes on the current committed state (14 sources ↔ 14 triggers ↔ 14 slug branches)","status":"passed","title":"passes on the current committed state (14 sources ↔ 14 triggers ↔ 14 slug branches)","duration":48.06778499999996,"failureMessages":[],"location":{"line":48,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-pat-fallback-coverage.mjs"],"fullName":"check-pat-fallback-coverage.mjs fails when a workflow name is mistyped in the fallback yml (the Translate Articles regression)","status":"passed","title":"fails when a workflow name is mistyped in the fallback yml (the Translate Articles regression)","duration":41.953484,"failureMessages":[],"location":{"line":56,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["check-pat-fallback-coverage.mjs"],"fullName":"check-pat-fallback-coverage.mjs fails when a news-*.md is added without a matching trigger entry","status":"passed","title":"fails when a news-*.md is added without a matching trigger entry","duration":42.41301400000003,"failureMessages":[],"location":{"line":72,"column":3},"meta":{},"tags":[]}],"startTime":1787953904850,"endTime":1787953904982.413,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/check-pat-fallback-coverage.test.ts"},{"assertionResults":[{"ancestorTitles":["chrome/ sub-module isolation"],"fullName":"chrome/ sub-module isolation types are importable (TypeScript compile check)","status":"passed","title":"types are importable (TypeScript compile check)","duration":3.7017809999999827,"failureMessages":[],"location":{"line":55,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ sub-module isolation"],"fullName":"chrome/ sub-module isolation helpers.ts exports depth, renderHreflangBlock, fallbackAlternateHref","status":"passed","title":"helpers.ts exports depth, renderHreflangBlock, fallbackAlternateHref","duration":0.619199999999978,"failureMessages":[],"location":{"line":60,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ sub-module isolation"],"fullName":"chrome/ sub-module isolation head.ts exports renderChromeHead","status":"passed","title":"head.ts exports renderChromeHead","duration":0.504052999999999,"failureMessages":[],"location":{"line":66,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ sub-module isolation"],"fullName":"chrome/ sub-module isolation header.ts exports buildHeaderHtml","status":"passed","title":"header.ts exports buildHeaderHtml","duration":0.4038760000000252,"failureMessages":[],"location":{"line":70,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ sub-module isolation"],"fullName":"chrome/ sub-module isolation footer.ts exports buildFooterHtml","status":"passed","title":"footer.ts exports buildFooterHtml","duration":0.44962199999997665,"failureMessages":[],"location":{"line":74,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — depth()"],"fullName":"chrome/helpers — depth() returns empty string for root-level files","status":"passed","title":"returns empty string for root-level files","duration":0.5207839999999919,"failureMessages":[],"location":{"line":84,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — depth()"],"fullName":"chrome/helpers — depth() returns ../ for one level deep","status":"passed","title":"returns ../ for one level deep","duration":0.45639399999998886,"failureMessages":[],"location":{"line":89,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — depth()"],"fullName":"chrome/helpers — depth() returns ../../ for two levels deep","status":"passed","title":"returns ../../ for two levels deep","duration":0.3391250000000241,"failureMessages":[],"location":{"line":93,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — depth()"],"fullName":"chrome/helpers — depth() strips leading slashes before computing depth","status":"passed","title":"strips leading slashes before computing depth","duration":0.5461129999999912,"failureMessages":[],"location":{"line":97,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — fallbackAlternateHref()"],"fullName":"chrome/helpers — fallbackAlternateHref() returns base unchanged for English","status":"passed","title":"returns base unchanged for English","duration":0.44986299999999346,"failureMessages":[],"location":{"line":108,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — fallbackAlternateHref()"],"fullName":"chrome/helpers — fallbackAlternateHref() appends _lang suffix for non-English","status":"passed","title":"appends _lang suffix for non-English","duration":0.4741180000000327,"failureMessages":[],"location":{"line":113,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — renderHreflangBlock()"],"fullName":"chrome/helpers — renderHreflangBlock() emits canonical + self alternate when no alternates provided","status":"passed","title":"emits canonical + self alternate when no alternates provided","duration":0.7048699999999712,"failureMessages":[],"location":{"line":126,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — renderHreflangBlock()"],"fullName":"chrome/helpers — renderHreflangBlock() emits all provided alternates + x-default","status":"passed","title":"emits all provided alternates + x-default","duration":0.6207829999999603,"failureMessages":[],"location":{"line":133,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/helpers — renderHreflangBlock()"],"fullName":"chrome/helpers — renderHreflangBlock() uses English alternate as x-default","status":"passed","title":"uses English alternate as x-default","duration":0.4439610000000016,"failureMessages":[],"location":{"line":147,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — HTML5 structure"],"fullName":"chrome/head — HTML5 structure starts with ","status":"passed","title":"starts with ","duration":1.1833260000000223,"failureMessages":[],"location":{"line":162,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — HTML5 structure"],"fullName":"chrome/head — HTML5 structure includes ","status":"passed","title":"includes ","duration":0.43175899999999956,"failureMessages":[],"location":{"line":167,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — HTML5 structure"],"fullName":"chrome/head — HTML5 structure sets dir=\"rtl\" for Arabic","status":"passed","title":"sets dir=\"rtl\" for Arabic","duration":0.3990180000000123,"failureMessages":[],"location":{"line":172,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — HTML5 structure"],"fullName":"chrome/head — HTML5 structure sets dir=\"rtl\" for Hebrew","status":"passed","title":"sets dir=\"rtl\" for Hebrew","duration":0.5177290000000312,"failureMessages":[],"location":{"line":177,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — HTML5 structure"],"fullName":"chrome/head — HTML5 structure includes charset and viewport meta","status":"passed","title":"includes charset and viewport meta","duration":0.49735099999998056,"failureMessages":[],"location":{"line":182,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — HTML5 structure"],"fullName":"chrome/head — HTML5 structure closes with ","status":"passed","title":"closes with ","duration":0.5961260000000266,"failureMessages":[],"location":{"line":188,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — SEO meta tags"],"fullName":"chrome/head — SEO meta tags includes branded title with Riksdagsmonitor suffix","status":"passed","title":"includes branded title with Riksdagsmonitor suffix","duration":0.5880810000000452,"failureMessages":[],"location":{"line":199,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — SEO meta tags"],"fullName":"chrome/head — SEO meta tags does not double-brand when title contains Riksdagsmonitor","status":"passed","title":"does not double-brand when title contains Riksdagsmonitor","duration":0.6473219999999742,"failureMessages":[],"location":{"line":204,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — SEO meta tags"],"fullName":"chrome/head — SEO meta tags includes OpenGraph meta tags","status":"passed","title":"includes OpenGraph meta tags","duration":0.7359680000000139,"failureMessages":[],"location":{"line":211,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — SEO meta tags"],"fullName":"chrome/head — SEO meta tags includes Twitter Card meta tags","status":"passed","title":"includes Twitter Card meta tags","duration":0.6029780000000073,"failureMessages":[],"location":{"line":221,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — SEO meta tags"],"fullName":"chrome/head — SEO meta tags suppresses article meta when ogType is website","status":"passed","title":"suppresses article meta when ogType is website","duration":0.5683539999999994,"failureMessages":[],"location":{"line":228,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — SEO meta tags"],"fullName":"chrome/head — SEO meta tags includes article:published_time for article type","status":"passed","title":"includes article:published_time for article type","duration":0.5686850000000163,"failureMessages":[],"location":{"line":236,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — JSON-LD"],"fullName":"chrome/head — JSON-LD renders JSON-LD blocks in script tags","status":"passed","title":"renders JSON-LD blocks in script tags","duration":0.6444859999999721,"failureMessages":[],"location":{"line":248,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — JSON-LD"],"fullName":"chrome/head — JSON-LD escapes < in JSON-LD to prevent XSS","status":"passed","title":"escapes < in JSON-LD to prevent XSS","duration":0.602346999999952,"failureMessages":[],"location":{"line":262,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — accessibility"],"fullName":"chrome/header — accessibility includes skip-link targeting #main","status":"passed","title":"includes skip-link targeting #main","duration":1.5314979999999991,"failureMessages":[],"location":{"line":278,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — accessibility"],"fullName":"chrome/header — accessibility header has role=\"banner\"","status":"passed","title":"header has role=\"banner\"","duration":0.6404790000000276,"failureMessages":[],"location":{"line":284,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — accessibility"],"fullName":"chrome/header — accessibility main content area has tabindex=\"-1\" for programmatic focus","status":"passed","title":"main content area has tabindex=\"-1\" for programmatic focus","duration":0.6894110000000069,"failureMessages":[],"location":{"line":289,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — accessibility"],"fullName":"chrome/header — accessibility breadcrumb nav has aria-label","status":"passed","title":"breadcrumb nav has aria-label","duration":0.8475369999999884,"failureMessages":[],"location":{"line":294,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — accessibility"],"fullName":"chrome/header — accessibility last breadcrumb item has aria-current=\"page\"","status":"passed","title":"last breadcrumb item has aria-current=\"page\"","duration":0.7060020000000122,"failureMessages":[],"location":{"line":300,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — accessibility"],"fullName":"chrome/header — accessibility language switcher dropdown items have role=\"menuitem\"","status":"passed","title":"language switcher dropdown items have role=\"menuitem\"","duration":0.7596729999999638,"failureMessages":[],"location":{"line":305,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ — RTL language handling"],"fullName":"chrome/ — RTL language handling renders dir=\"rtl\" in for ar","status":"passed","title":"renders dir=\"rtl\" in for ar","duration":0.6045819999999935,"failureMessages":[],"location":{"line":319,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ — RTL language handling"],"fullName":"chrome/ — RTL language handling header renders correctly for ar","status":"passed","title":"header renders correctly for ar","duration":0.7649420000000191,"failureMessages":[],"location":{"line":324,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ — RTL language handling"],"fullName":"chrome/ — RTL language handling footer renders correctly for ar","status":"passed","title":"footer renders correctly for ar","duration":1.2368960000000015,"failureMessages":[],"location":{"line":330,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ — RTL language handling"],"fullName":"chrome/ — RTL language handling renders dir=\"rtl\" in for he","status":"passed","title":"renders dir=\"rtl\" in for he","duration":0.7023659999999836,"failureMessages":[],"location":{"line":319,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ — RTL language handling"],"fullName":"chrome/ — RTL language handling header renders correctly for he","status":"passed","title":"header renders correctly for he","duration":0.7290050000000292,"failureMessages":[],"location":{"line":324,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["chrome/ — RTL language handling"],"fullName":"chrome/ — RTL language handling footer renders correctly for he","status":"passed","title":"footer renders correctly for he","duration":0.7268709999999601,"failureMessages":[],"location":{"line":330,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — language switcher"],"fullName":"chrome/header — language switcher header dropdown contains 13 language links (all except current)","status":"passed","title":"header dropdown contains 13 language links (all except current)","duration":1.6770500000000084,"failureMessages":[],"location":{"line":342,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — language switcher"],"fullName":"chrome/header — language switcher horizontal language bar contains all 14 languages (1 current + 13 links)","status":"passed","title":"horizontal language bar contains all 14 languages (1 current + 13 links)","duration":1.138272000000029,"failureMessages":[],"location":{"line":348,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — language switcher"],"fullName":"chrome/header — language switcher uses explicit hreflangAlternates when provided","status":"passed","title":"uses explicit hreflangAlternates when provided","duration":0.8495100000000093,"failureMessages":[],"location":{"line":359,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/footer — structure"],"fullName":"chrome/footer — structure includes role=\"contentinfo\"","status":"passed","title":"includes role=\"contentinfo\"","duration":0.7596320000000105,"failureMessages":[],"location":{"line":377,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/footer — structure"],"fullName":"chrome/footer — structure includes ISMS section with policies","status":"passed","title":"includes ISMS section with policies","duration":0.8070410000000265,"failureMessages":[],"location":{"line":382,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/footer — structure"],"fullName":"chrome/footer — structure includes trust badges with external links","status":"passed","title":"includes trust badges with external links","duration":0.8118100000000368,"failureMessages":[],"location":{"line":388,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/footer — structure"],"fullName":"chrome/footer — structure includes secondary language row","status":"passed","title":"includes secondary language row","duration":0.7627790000000232,"failureMessages":[],"location":{"line":394,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/footer — structure"],"fullName":"chrome/footer — structure includes copyright with current year","status":"passed","title":"includes copyright with current year","duration":0.7937659999998914,"failureMessages":[],"location":{"line":399,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/footer — structure"],"fullName":"chrome/footer — structure closes with ","status":"passed","title":"closes with ","duration":0.9983690000000252,"failureMessages":[],"location":{"line":404,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/footer — structure"],"fullName":"chrome/footer — structure includes Mermaid/theme bootstrap scripts","status":"passed","title":"includes Mermaid/theme bootstrap scripts","duration":3.960739999999987,"failureMessages":[],"location":{"line":410,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts façade — buildChrome"],"fullName":"chrome.ts façade — buildChrome returns head/headerHtml/footerHtml matching sub-module outputs","status":"passed","title":"returns head/headerHtml/footerHtml matching sub-module outputs","duration":1.0739609999999402,"failureMessages":[],"location":{"line":423,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts façade — buildChrome"],"fullName":"chrome.ts façade — buildChrome façade renderChromeHead matches sub-module renderChromeHead","status":"passed","title":"façade renderChromeHead matches sub-module renderChromeHead","duration":0.7141870000000381,"failureMessages":[],"location":{"line":431,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — hreflang for all 14 languages"],"fullName":"chrome/head — hreflang for all 14 languages emits hreflang link for each provided alternate","status":"passed","title":"emits hreflang link for each provided alternate","duration":0.9255529999999226,"failureMessages":[],"location":{"line":442,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — hero banner"],"fullName":"chrome/header — hero banner includes hero banner by default","status":"passed","title":"includes hero banner by default","duration":0.7891070000000582,"failureMessages":[],"location":{"line":465,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — hero banner"],"fullName":"chrome/header — hero banner excludes hero banner when heroBanner=false","status":"passed","title":"excludes hero banner when heroBanner=false","duration":0.6900920000000497,"failureMessages":[],"location":{"line":474,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/header — hero banner"],"fullName":"chrome/header — hero banner uses custom banner image when provided","status":"passed","title":"uses custom banner image when provided","duration":0.7423800000000256,"failureMessages":[],"location":{"line":480,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — rel prev/next"],"fullName":"chrome/head — rel prev/next includes rel=prev when relPrev provided","status":"passed","title":"includes rel=prev when relPrev provided","duration":0.7188050000000885,"failureMessages":[],"location":{"line":492,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — rel prev/next"],"fullName":"chrome/head — rel prev/next includes rel=next when relNext provided","status":"passed","title":"includes rel=next when relNext provided","duration":0.8012600000000702,"failureMessages":[],"location":{"line":499,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome/head — rel prev/next"],"fullName":"chrome/head — rel prev/next omits pagination links when neither relPrev nor relNext provided","status":"passed","title":"omits pagination links when neither relPrev nor relNext provided","duration":0.7451049999999668,"failureMessages":[],"location":{"line":505,"column":3},"meta":{},"tags":[]}],"startTime":1787953683396,"endTime":1787953683445.745,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/chrome-decomposition.test.ts"},{"assertionResults":[{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) includes the section header comment that introduces the block","status":"passed","title":"includes the section header comment that introduces the block","duration":3.635226999999986,"failureMessages":[],"location":{"line":25,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) uses :where() to target both header families with controlled specificity","status":"passed","title":"uses :where() to target both header families with controlled specificity","duration":0.76543300000003,"failureMessages":[],"location":{"line":31,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) uses :where() to target both footer families with controlled specificity","status":"passed","title":"uses :where() to target both footer families with controlled specificity","duration":0.646049000000005,"failureMessages":[],"location":{"line":35,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) harmonises both theme-toggle button variants","status":"passed","title":"harmonises both theme-toggle button variants","duration":0.5622030000000109,"failureMessages":[],"location":{"line":39,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) harmonises both language-switcher variants","status":"passed","title":"harmonises both language-switcher variants","duration":0.5748869999999897,"failureMessages":[],"location":{"line":43,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) makes both header families sticky at the top","status":"passed","title":"makes both header families sticky at the top","duration":0.8301040000000057,"failureMessages":[],"location":{"line":47,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) provides explicit light-mode polish for the header (rgba glass + cyan border)","status":"passed","title":"provides explicit light-mode polish for the header (rgba glass + cyan border)","duration":0.7385229999999865,"failureMessages":[],"location":{"line":55,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) enforces WCAG 2.5.5 touch targets (≥ 44×44) on mobile","status":"passed","title":"enforces WCAG 2.5.5 touch targets (≥ 44×44) on mobile","duration":0.6308210000000258,"failureMessages":[],"location":{"line":62,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) declares a visible :focus-visible outline using the cyan token","status":"passed","title":"declares a visible :focus-visible outline using the cyan token","duration":0.7643720000000371,"failureMessages":[],"location":{"line":69,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) wraps hover transforms inside prefers-reduced-motion: no-preference","status":"passed","title":"wraps hover transforms inside prefers-reduced-motion: no-preference","duration":0.40695299999998724,"failureMessages":[],"location":{"line":75,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Cross-family chrome harmonisation block (styles.css)"],"fullName":"Cross-family chrome harmonisation block (styles.css) does not introduce any !important declarations in the harmonisation block","status":"passed","title":"does not introduce any !important declarations in the harmonisation block","duration":0.7016840000000002,"failureMessages":[],"location":{"line":79,"column":3},"meta":{},"tags":[]}],"startTime":1787953907761,"endTime":1787953907770.7017,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/chrome-harmonisation.test.js"},{"assertionResults":[{"ancestorTitles":["chrome-i18n — hero & header-tagline keys"],"fullName":"chrome-i18n — hero & header-tagline keys defines every new key for every supported language","status":"passed","title":"defines every new key for every supported language","duration":9.101833,"failureMessages":[],"location":{"line":39,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome-i18n — hero & header-tagline keys"],"fullName":"chrome-i18n — hero & header-tagline keys translates non-English values (no copy-paste of English strings)","status":"passed","title":"translates non-English values (no copy-paste of English strings)","duration":4.609591000000023,"failureMessages":[],"location":{"line":50,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — header tagline reflects language"],"fullName":"chrome.ts — header tagline reflects language renders Swedish tagline for sv chrome","status":"passed","title":"renders Swedish tagline for sv chrome","duration":3.7609319999999684,"failureMessages":[],"location":{"line":68,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — header tagline reflects language"],"fullName":"chrome.ts — header tagline reflects language renders Arabic tagline for ar chrome (RTL)","status":"passed","title":"renders Arabic tagline for ar chrome (RTL)","duration":0.8866799999999557,"failureMessages":[],"location":{"line":82,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — header tagline reflects language"],"fullName":"chrome.ts — header tagline reflects language keeps the English tagline for en chrome","status":"passed","title":"keeps the English tagline for en chrome","duration":0.7594019999999659,"failureMessages":[],"location":{"line":93,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome-i18n — Political Intelligence CTA & ecosystem keys"],"fullName":"chrome-i18n — Political Intelligence CTA & ecosystem keys defines every new CTA/ecosystem key for every supported language","status":"passed","title":"defines every new CTA/ecosystem key for every supported language","duration":2.493268999999998,"failureMessages":[],"location":{"line":112,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome-i18n — Political Intelligence CTA & ecosystem keys"],"fullName":"chrome-i18n — Political Intelligence CTA & ecosystem keys translates non-English CTA/ecosystem values (differ from English)","status":"passed","title":"translates non-English CTA/ecosystem values (differ from English)","duration":1.7177659999999833,"failureMessages":[],"location":{"line":123,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome-i18n — Political Intelligence CTA & ecosystem keys"],"fullName":"chrome-i18n — Political Intelligence CTA & ecosystem keys renders Political Intelligence CTA in header","status":"passed","title":"renders Political Intelligence CTA in header","duration":0.8114590000000135,"failureMessages":[],"location":{"line":136,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome-i18n — Political Intelligence CTA & ecosystem keys"],"fullName":"chrome-i18n — Political Intelligence CTA & ecosystem keys renders EU Parliament Monitor link in footer","status":"passed","title":"renders EU Parliament Monitor link in footer","duration":0.8792459999999664,"failureMessages":[],"location":{"line":148,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome-i18n — Political Intelligence CTA & ecosystem keys"],"fullName":"chrome-i18n — Political Intelligence CTA & ecosystem keys renders Hack23 Blog link in footer","status":"passed","title":"renders Hack23 Blog link in footer","duration":0.7514370000000099,"failureMessages":[],"location":{"line":160,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome-i18n — Political Intelligence CTA & ecosystem keys"],"fullName":"chrome-i18n — Political Intelligence CTA & ecosystem keys renders translated Political Intelligence CTA for Swedish","status":"passed","title":"renders translated Political Intelligence CTA for Swedish","duration":0.774610999999993,"failureMessages":[],"location":{"line":172,"column":3},"meta":{},"tags":[]}],"startTime":1787953865399,"endTime":1787953865425.7747,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/chrome-i18n-hero.test.ts"},{"assertionResults":[{"ancestorTitles":["chrome.ts — FAQPage auto-emission"],"fullName":"chrome.ts — FAQPage auto-emission emits FAQPage JSON-LD when ≥2 faqItems are supplied","status":"passed","title":"emits FAQPage JSON-LD when ≥2 faqItems are supplied","duration":8.076101999999992,"failureMessages":[],"location":{"line":15,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — FAQPage auto-emission"],"fullName":"chrome.ts — FAQPage auto-emission does NOT emit FAQPage JSON-LD when only 1 faqItem is supplied","status":"passed","title":"does NOT emit FAQPage JSON-LD when only 1 faqItem is supplied","duration":1.1106100000000083,"failureMessages":[],"location":{"line":30,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — FAQPage auto-emission"],"fullName":"chrome.ts — FAQPage auto-emission does NOT emit FAQPage JSON-LD when faqItems is empty","status":"passed","title":"does NOT emit FAQPage JSON-LD when faqItems is empty","duration":0.83271000000002,"failureMessages":[],"location":{"line":41,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — meta description never empty (SEO guard)"],"fullName":"chrome.ts — meta description never empty (SEO guard) falls back to the page title when description is an empty string","status":"passed","title":"falls back to the page title when description is an empty string","duration":0.9691040000000157,"failureMessages":[],"location":{"line":54,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — meta description never empty (SEO guard)"],"fullName":"chrome.ts — meta description never empty (SEO guard) falls back to the page title when description is whitespace only","status":"passed","title":"falls back to the page title when description is whitespace only","duration":0.8276299999999992,"failureMessages":[],"location":{"line":67,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — meta description never empty (SEO guard)"],"fullName":"chrome.ts — meta description never empty (SEO guard) keeps a supplied non-empty description unchanged","status":"passed","title":"keeps a supplied non-empty description unchanged","duration":0.676085999999998,"failureMessages":[],"location":{"line":86,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — WebPage speakable merge"],"fullName":"chrome.ts — WebPage speakable merge merges speakable into an existing WebPage node without duplication","status":"passed","title":"merges speakable into an existing WebPage node without duplication","duration":1.0194680000000176,"failureMessages":[],"location":{"line":100,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — WebPage speakable merge"],"fullName":"chrome.ts — WebPage speakable merge does NOT mutate the caller-provided jsonLd objects","status":"passed","title":"does NOT mutate the caller-provided jsonLd objects","duration":1.207080000000019,"failureMessages":[],"location":{"line":123,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — WebPage speakable merge"],"fullName":"chrome.ts — WebPage speakable merge emits a standalone WebPage node when no existing one is present","status":"passed","title":"emits a standalone WebPage node when no existing one is present","duration":0.8189629999999966,"failureMessages":[],"location":{"line":143,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — rel=prev/next pagination links"],"fullName":"chrome.ts — rel=prev/next pagination links emits when relNext is provided","status":"passed","title":"emits when relNext is provided","duration":0.7400559999999814,"failureMessages":[],"location":{"line":157,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — rel=prev/next pagination links"],"fullName":"chrome.ts — rel=prev/next pagination links emits when relPrev is provided","status":"passed","title":"emits when relPrev is provided","duration":1.007316000000003,"failureMessages":[],"location":{"line":169,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — rel=prev/next pagination links"],"fullName":"chrome.ts — rel=prev/next pagination links HTML-escapes relNext/relPrev hrefs","status":"passed","title":"HTML-escapes relNext/relPrev hrefs","duration":0.9190609999999992,"failureMessages":[],"location":{"line":180,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["chrome.ts — rel=prev/next pagination links"],"fullName":"chrome.ts — rel=prev/next pagination links does not emit pagination links when neither relPrev nor relNext is provided","status":"passed","title":"does not emit pagination links when neither relPrev nor relNext is provided","duration":0.6424729999999954,"failureMessages":[],"location":{"line":193,"column":3},"meta":{},"tags":[]}],"startTime":1787953856849,"endTime":1787953856868.6426,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/chrome-seo-features.test.ts"},{"assertionResults":[{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_performance.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_performance.csv file exists on disk","status":"passed","title":"file exists on disk","duration":3.9455879999999866,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_performance.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_performance.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":1.4007030000000213,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_performance.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_performance.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.7629680000000008,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_effectiveness_trends.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_effectiveness_trends.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.4299340000000029,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_effectiveness_trends.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_effectiveness_trends.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5348710000000096,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_effectiveness_trends.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_effectiveness_trends.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.6030189999999607,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_momentum.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_momentum.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.46998000000002094,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_momentum.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_momentum.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5302429999999845,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_party_momentum.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_party_momentum.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.6483139999999707,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_coalition_alignment.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_coalition_alignment.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.43393300000002455,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_coalition_alignment.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_coalition_alignment.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.6806149999999889,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_coalition_alignment.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_coalition_alignment.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.38481000000001586,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_annual_party_members.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_annual_party_members.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.42328199999997196,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_annual_party_members.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_annual_party_members.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.44426100000004,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: parties","/cia-data/party/distribution_annual_party_members.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: parties /cia-data/party/distribution_annual_party_members.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.6091600000000312,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/parties/distribution_behavioral_patterns_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/parties/distribution_behavioral_patterns_by_party.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.6931680000000142,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/parties/distribution_behavioral_patterns_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/parties/distribution_behavioral_patterns_by_party.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.6431539999999814,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/parties/distribution_behavioral_patterns_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/parties/distribution_behavioral_patterns_by_party.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.40351600000002463,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/parties/distribution_decision_patterns_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/parties/distribution_decision_patterns_by_party.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.4417879999999741,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/parties/distribution_decision_patterns_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/parties/distribution_decision_patterns_by_party.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.47656200000000126,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/parties/distribution_decision_patterns_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/parties/distribution_decision_patterns_by_party.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.5715200000000209,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/anomaly/distribution_anomaly_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/anomaly/distribution_anomaly_by_party.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.4962489999999775,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/anomaly/distribution_anomaly_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/anomaly/distribution_anomaly_by_party.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5737349999999992,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: coalitions","/cia-data/anomaly/distribution_anomaly_by_party.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: coalitions /cia-data/anomaly/distribution_anomaly_by_party.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.5655680000000416,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: committees","/cia-data/distribution_committee_productivity_matrix.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: committees /cia-data/distribution_committee_productivity_matrix.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.4654019999999832,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: committees","/cia-data/distribution_committee_productivity_matrix.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: committees /cia-data/distribution_committee_productivity_matrix.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5556399999999826,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: committees","/cia-data/distribution_committee_productivity_matrix.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: committees /cia-data/distribution_committee_productivity_matrix.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.5541169999999624,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: committees","/cia-data/distribution_annual_committee_documents.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: committees /cia-data/distribution_annual_committee_documents.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5072999999999865,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: committees","/cia-data/distribution_annual_committee_documents.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: committees /cia-data/distribution_annual_committee_documents.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5908060000000432,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: committees","/cia-data/distribution_annual_committee_documents.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: committees /cia-data/distribution_annual_committee_documents.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.7168720000000235,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_comparative_analysis_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_comparative_analysis_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.675926000000004,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_comparative_analysis_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_comparative_analysis_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5885729999999967,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_comparative_analysis_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_comparative_analysis_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.5109469999999874,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_decision_intelligence_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_decision_intelligence_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5303930000000037,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_decision_intelligence_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_decision_intelligence_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.6214240000000473,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_decision_intelligence_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_decision_intelligence_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.6395480000000475,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_predictive_intelligence_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_predictive_intelligence_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5359340000000543,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_predictive_intelligence_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_predictive_intelligence_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5733629999999721,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_predictive_intelligence_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_predictive_intelligence_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.566159999999968,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_temporal_trends_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_temporal_trends_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5481770000000097,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_temporal_trends_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_temporal_trends_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.8044360000000097,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: election-cycle","/cia-data/election-cycle/view_election_cycle_temporal_trends_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: election-cycle /cia-data/election-cycle/view_election_cycle_temporal_trends_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.7070940000000405,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: seasonal-patterns","/cia-data/seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: seasonal-patterns /cia-data/seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5756079999999884,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: seasonal-patterns","/cia-data/seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: seasonal-patterns /cia-data/seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.694500000000005,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: seasonal-patterns","/cia-data/seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: seasonal-patterns /cia-data/seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":4.9208830000000034,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: pre-election","/cia-data/pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: pre-election /cia-data/pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5689750000000231,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: pre-election","/cia-data/pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: pre-election /cia-data/pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5029419999999618,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: pre-election","/cia-data/pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: pre-election /cia-data/pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.5186710000000403,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: pre-election","/cia-data/pre-election/view_riksdagen_q4_election_year_comparison_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: pre-election /cia-data/pre-election/view_riksdagen_q4_election_year_comparison_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.4751499999999851,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: pre-election","/cia-data/pre-election/view_riksdagen_q4_election_year_comparison_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: pre-election /cia-data/pre-election/view_riksdagen_q4_election_year_comparison_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5397000000000389,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: pre-election","/cia-data/pre-election/view_riksdagen_q4_election_year_comparison_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: pre-election /cia-data/pre-election/view_riksdagen_q4_election_year_comparison_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.5001869999999826,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: anomaly-detection","/cia-data/seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: anomaly-detection /cia-data/seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5103050000000167,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: anomaly-detection","/cia-data/seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: anomaly-detection /cia-data/seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5234399999999937,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: anomaly-detection","/cia-data/seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: anomaly-detection /cia-data/seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.5627439999999524,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_productivity_matrix.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_productivity_matrix.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.5187109999999961,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_productivity_matrix.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_productivity_matrix.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.5961970000000179,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_productivity_matrix.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_productivity_matrix.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.593071000000009,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_risk_levels.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_risk_levels.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.8278700000000185,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_risk_levels.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_risk_levels.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":1.0407490000000053,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_risk_levels.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_risk_levels.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.7154899999999884,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_decision_impact.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_decision_impact.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.6533729999999878,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_decision_impact.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_decision_impact.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.73753099999999,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_decision_impact.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_decision_impact.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.6646349999999757,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_effectiveness.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_effectiveness.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.6760659999999916,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_effectiveness.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_effectiveness.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.718685999999991,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_effectiveness.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_effectiveness.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.7192759999999794,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_risk_quarterly.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_risk_quarterly.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.7031560000000354,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_risk_quarterly.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_risk_quarterly.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.7944269999999847,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/distribution_ministry_risk_quarterly.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/distribution_ministry_risk_quarterly.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.8007489999999962,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/politician/view_riksdagen_politician_influence_metrics_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/politician/view_riksdagen_politician_influence_metrics_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.779640000000029,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/politician/view_riksdagen_politician_influence_metrics_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/politician/view_riksdagen_politician_influence_metrics_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.858887999999979,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/politician/view_riksdagen_politician_influence_metrics_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/politician/view_riksdagen_politician_influence_metrics_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.8452329999999506,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/view_ministry_productivity_matrix_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/view_ministry_productivity_matrix_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.8642380000000003,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/view_ministry_productivity_matrix_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/view_ministry_productivity_matrix_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.9099340000000211,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/view_ministry_productivity_matrix_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/view_ministry_productivity_matrix_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":1.005262000000016,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/view_ministry_risk_evolution_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/view_ministry_risk_evolution_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":0.8908480000000054,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/view_ministry_risk_evolution_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/view_ministry_risk_evolution_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":0.9827610000000391,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: ministers","/cia-data/ministry/view_ministry_risk_evolution_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: ministers /cia-data/ministry/view_ministry_risk_evolution_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":0.9378360000000043,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: risk","/cia-data/politician/view_politician_risk_summary_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: risk /cia-data/politician/view_politician_risk_summary_sample.csv file exists on disk","status":"passed","title":"file exists on disk","duration":1.0867150000000265,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: risk","/cia-data/politician/view_politician_risk_summary_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: risk /cia-data/politician/view_politician_risk_summary_sample.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":1.1716940000000022,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: risk","/cia-data/politician/view_politician_risk_summary_sample.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: risk /cia-data/politician/view_politician_risk_summary_sample.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":1.1836669999999572,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: cia-hub","/cia-data/election/election_forecast.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: cia-hub /cia-data/election/election_forecast.csv file exists on disk","status":"passed","title":"file exists on disk","duration":1.4920740000000023,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: cia-hub","/cia-data/election/election_forecast.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: cia-hub /cia-data/election/election_forecast.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":1.7677099999999655,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: cia-hub","/cia-data/election/election_forecast.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: cia-hub /cia-data/election/election_forecast.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":1.1488509999999792,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: cia-hub","/cia-data/election/coalition_scenarios.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: cia-hub /cia-data/election/coalition_scenarios.csv file exists on disk","status":"passed","title":"file exists on disk","duration":1.0449859999999944,"failureMessages":[],"location":{"line":48,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: cia-hub","/cia-data/election/coalition_scenarios.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: cia-hub /cia-data/election/coalition_scenarios.csv header row contains every required column (no legacy column fallbacks)","status":"passed","title":"header row contains every required column (no legacy column fallbacks)","duration":1.0803429999999707,"failureMessages":[],"location":{"line":55,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — every dashboard CSV has its declared canonical schema","dashboard: cia-hub","/cia-data/election/coalition_scenarios.csv"],"fullName":"CSV contracts — every dashboard CSV has its declared canonical schema dashboard: cia-hub /cia-data/election/coalition_scenarios.csv has at least 1 data row(s)","status":"passed","title":"has at least 1 data row(s)","duration":1.151365999999939,"failureMessages":[],"location":{"line":65,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — registry sanity"],"fullName":"CSV contracts — registry sanity every contract path is absolute and starts with /cia-data/","status":"passed","title":"every contract path is absolute and starts with /cia-data/","duration":1.8177230000000009,"failureMessages":[],"location":{"line":79,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — registry sanity"],"fullName":"CSV contracts — registry sanity no contract has duplicate column entries","status":"passed","title":"no contract has duplicate column entries","duration":1.7745319999999083,"failureMessages":[],"location":{"line":85,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CSV contracts — registry sanity"],"fullName":"CSV contracts — registry sanity no two contracts share the same path","status":"passed","title":"no two contracts share the same path","duration":1.2162069999999403,"failureMessages":[],"location":{"line":94,"column":3},"meta":{},"tags":[]}],"startTime":1787953905875,"endTime":1787953905950.2163,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-csv-contracts.test.ts"},{"assertionResults":[{"ancestorTitles":["csv-validator: CsvContractError"],"fullName":"csv-validator: CsvContractError exposes structured fields on the error instance","status":"passed","title":"exposes structured fields on the error instance","duration":5.315502999999978,"failureMessages":[],"location":{"line":34,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRows (override contract)"],"fullName":"csv-validator: validateCsvRows (override contract) returns rows unchanged when all required columns and minRows are satisfied","status":"passed","title":"returns rows unchanged when all required columns and minRows are satisfied","duration":0.7767939999999953,"failureMessages":[],"location":{"line":55,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRows (override contract)"],"fullName":"csv-validator: validateCsvRows (override contract) throws CsvContractError when a required column is missing from the header","status":"passed","title":"throws CsvContractError when a required column is missing from the header","duration":0.8664120000000253,"failureMessages":[],"location":{"line":64,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRows (override contract)"],"fullName":"csv-validator: validateCsvRows (override contract) throws CsvContractError when row count is below minRows","status":"passed","title":"throws CsvContractError when row count is below minRows","duration":0.587771000000032,"failureMessages":[],"location":{"line":81,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRows (override contract)"],"fullName":"csv-validator: validateCsvRows (override contract) throws CsvContractError on zero rows (header keys unknown)","status":"passed","title":"throws CsvContractError on zero rows (header keys unknown)","duration":0.7961310000000026,"failureMessages":[],"location":{"line":94,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRows (override contract)"],"fullName":"csv-validator: validateCsvRows (override contract) defaults minRows to 1 when contract omits the field","status":"passed","title":"defaults minRows to 1 when contract omits the field","duration":1.3488849999999957,"failureMessages":[],"location":{"line":111,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRows (registered contract)"],"fullName":"csv-validator: validateCsvRows (registered contract) uses getCsvContract lookup when no override contract is supplied","status":"passed","title":"uses getCsvContract lookup when no override contract is supplied","duration":0.5498900000000049,"failureMessages":[],"location":{"line":127,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRows (registered contract)"],"fullName":"csv-validator: validateCsvRows (registered contract) returns input unchanged when no contract is registered for the path","status":"passed","title":"returns input unchanged when no contract is registered for the path","duration":0.4008209999999508,"failureMessages":[],"location":{"line":136,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRowsLenient"],"fullName":"csv-validator: validateCsvRowsLenient returns true and does not log when the contract is satisfied","status":"passed","title":"returns true and does not log when the contract is satisfied","duration":0.8163580000000366,"failureMessages":[],"location":{"line":148,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["csv-validator: validateCsvRowsLenient"],"fullName":"csv-validator: validateCsvRowsLenient returns false and logs to console.error on CsvContractError","status":"passed","title":"returns false and logs to console.error on CsvContractError","duration":0.7389429999999493,"failureMessages":[],"location":{"line":159,"column":3},"meta":{},"tags":[]}],"startTime":1787953865892,"endTime":1787953865905.739,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-csv-validator.test.ts"},{"assertionResults":[{"ancestorTitles":["CIA dashboard production entry contract"],"fullName":"CIA dashboard production entry contract uses explicit imports so production tree shaking keeps the dashboard bootstrap","status":"passed","title":"uses explicit imports so production tree shaking keeps the dashboard bootstrap","duration":3.8500490000000127,"failureMessages":[],"location":{"line":6,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA dashboard production entry contract"],"fullName":"CIA dashboard production entry contract keeps bootstrap ownership explicit without module import side effects","status":"passed","title":"keeps bootstrap ownership explicit without module import side effects","duration":0.8196849999999927,"failureMessages":[],"location":{"line":14,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA dashboard production entry contract"],"fullName":"CIA dashboard production entry contract marks only the source entry bootstrap as side-effectful for the app build","status":"passed","title":"marks only the source entry bootstrap as side-effectful for the app build","duration":2.117775999999992,"failureMessages":[],"location":{"line":23,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA dashboard production entry contract"],"fullName":"CIA dashboard production entry contract keeps the bootstrap import on the first line of executable code in cia-entry","status":"passed","title":"keeps the bootstrap import on the first line of executable code in cia-entry","duration":0.6581919999999855,"failureMessages":[],"location":{"line":44,"column":3},"meta":{},"tags":[]}],"startTime":1787953916575,"endTime":1787953916582.6582,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-dashboard-entry-contract.test.ts"},{"assertionResults":[{"ancestorTitles":["CIADataLoader dashboard sections"],"fullName":"CIADataLoader dashboard sections uses coalition alignment CSV when available","status":"passed","title":"uses coalition alignment CSV when available","duration":8.161090000000002,"failureMessages":[],"location":{"line":27,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader dashboard sections"],"fullName":"CIADataLoader dashboard sections falls back to win-rate similarity when coalition alignment CSV is unavailable","status":"passed","title":"falls back to win-rate similarity when coalition alignment CSV is unavailable","duration":1.5599109999999996,"failureMessages":[],"location":{"line":57,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader dashboard sections"],"fullName":"CIADataLoader dashboard sections parses and filters ministry dashboard rows","status":"passed","title":"parses and filters ministry dashboard rows","duration":2.961023999999952,"failureMessages":[],"location":{"line":81,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader dashboard sections"],"fullName":"CIADataLoader dashboard sections parses demographics and keeps only Riksdag parties","status":"passed","title":"parses demographics and keeps only Riksdag parties","duration":1.5627860000000169,"failureMessages":[],"location":{"line":103,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader dashboard sections"],"fullName":"CIADataLoader dashboard sections parses document activity and risk evolution with zero-row filtering","status":"passed","title":"parses document activity and risk evolution with zero-row filtering","duration":1.7073369999999954,"failureMessages":[],"location":{"line":128,"column":3},"meta":{},"tags":[]}],"startTime":1787953890903,"endTime":1787953890918.7073,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-data-loader-dashboard-sections.test.ts"},{"assertionResults":[{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should build election analysis from CSV sources","status":"passed","title":"should build election analysis from CSV sources","duration":8.63455700000003,"failureMessages":[],"location":{"line":63,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should parse party forecast data correctly","status":"passed","title":"should parse party forecast data correctly","duration":1.8333719999999971,"failureMessages":[],"location":{"line":84,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should drop confidenceInterval when CSV cells are empty strings","status":"passed","title":"should drop confidenceInterval when CSV cells are empty strings","duration":0.7626580000000445,"failureMessages":[],"location":{"line":103,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should drop forecast rows with non-numeric required fields","status":"passed","title":"should drop forecast rows with non-numeric required fields","duration":0.8521959999999922,"failureMessages":[],"location":{"line":119,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should parse coalition scenarios correctly","status":"passed","title":"should parse coalition scenarios correctly","duration":1.5094569999999976,"failureMessages":[],"location":{"line":136,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should drop coalition rows with non-numeric required fields","status":"passed","title":"should drop coalition rows with non-numeric required fields","duration":0.9155739999999923,"failureMessages":[],"location":{"line":156,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should drop coalition rows with invalid majority and empty risk level","status":"passed","title":"should drop coalition rows with invalid majority and empty risk level","duration":1.2068700000000376,"failureMessages":[],"location":{"line":173,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","loadElectionAnalysis (CSV-based)"],"fullName":"CIADataLoader loadElectionAnalysis (CSV-based) should return empty parties when CSV fetch fails","status":"passed","title":"should return empty parties when CSV fetch fails","duration":0.7190760000000296,"failureMessages":[],"location":{"line":197,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","CSV_SOURCES"],"fullName":"CIADataLoader CSV_SOURCES should include election forecast and coalition scenarios","status":"passed","title":"should include election forecast and coalition scenarios","duration":0.511667999999986,"failureMessages":[],"location":{"line":215,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader","election analysis source behavior"],"fullName":"CIADataLoader election analysis source behavior should request election CSV files and never request election-analysis.json","status":"passed","title":"should request election CSV files and never request election-analysis.json","duration":0.9079499999999712,"failureMessages":[],"location":{"line":228,"column":5},"meta":{},"tags":[]}],"startTime":1787953834876,"endTime":1787953834893.908,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-data-loader-election.test.ts"},{"assertionResults":[{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator exposes the same constants and CSV_SOURCES as the extracted modules","status":"passed","title":"exposes the same constants and CSV_SOURCES as the extracted modules","duration":4.645118000000025,"failureMessages":[],"location":{"line":16,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator parseCSV delegates to the shared helper","status":"passed","title":"parseCSV delegates to the shared helper","duration":3.059248000000025,"failureMessages":[],"location":{"line":23,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator parseCSV handles quoted commas and multiline fields from larger CIA exports","status":"passed","title":"parseCSV handles quoted commas and multiline fields from larger CIA exports","duration":0.8896460000000275,"failureMessages":[],"location":{"line":29,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator parseCSV normalizes headers and surfaces malformed CSV errors","status":"passed","title":"parseCSV normalizes headers and surfaces malformed CSV errors","duration":1.6349909999999568,"failureMessages":[],"location":{"line":42,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator loadCSV uses the configured base URL and fallback URL","status":"passed","title":"loadCSV uses the configured base URL and fallback URL","duration":1.2904660000000376,"failureMessages":[],"location":{"line":51,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator loadCSV recovers from network errors and warns on full failure","status":"passed","title":"loadCSV recovers from network errors and warns on full failure","duration":0.9814269999999965,"failureMessages":[],"location":{"line":68,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator loadAll wires up every per-domain loader","status":"passed","title":"loadAll wires up every per-domain loader","duration":1.2690259999999967,"failureMessages":[],"location":{"line":81,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIADataLoader orchestrator"],"fullName":"CIADataLoader orchestrator loadPartyPerformance and loadTop10Influential delegate to the loader modules","status":"passed","title":"loadPartyPerformance and loadTop10Influential delegate to the loader modules","duration":2.9491120000000137,"failureMessages":[],"location":{"line":114,"column":3},"meta":{},"tags":[]}],"startTime":1787953867697,"endTime":1787953867713.9492,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-data-loader-orchestrator.test.ts"},{"assertionResults":[{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadOverviewDashboard"],"fullName":"CIA per-domain loaders (extracted modules) loadOverviewDashboard aggregates active MP, party and risk totals","status":"passed","title":"aggregates active MP, party and risk totals","duration":7.841072999999994,"failureMessages":[],"location":{"line":35,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadOverviewDashboard"],"fullName":"CIA per-domain loaders (extracted modules) loadOverviewDashboard falls back to defaults when CSV sources are empty","status":"passed","title":"falls back to defaults when CSV sources are empty","duration":0.5947039999999788,"failureMessages":[],"location":{"line":79,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadElectionAnalysis"],"fullName":"CIA per-domain loaders (extracted modules) loadElectionAnalysis parses forecast and scenarios from CSV inputs","status":"passed","title":"parses forecast and scenarios from CSV inputs","duration":3.2843599999999924,"failureMessages":[],"location":{"line":89,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadVotingPatterns"],"fullName":"CIA per-domain loaders (extracted modules) loadVotingPatterns uses real coalition alignment data when available","status":"passed","title":"uses real coalition alignment data when available","duration":1.206249000000014,"failureMessages":[],"location":{"line":113,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadMinistryDashboard"],"fullName":"CIA per-domain loaders (extracted modules) loadMinistryDashboard sorts ministries by documents produced and filters zero rows","status":"passed","title":"sorts ministries by documents produced and filters zero rows","duration":1.050247000000013,"failureMessages":[],"location":{"line":131,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadDemographics"],"fullName":"CIA per-domain loaders (extracted modules) loadDemographics keeps only the 8 Riksdag parties","status":"passed","title":"keeps only the 8 Riksdag parties","duration":1.1753709999999842,"failureMessages":[],"location":{"line":148,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadDocumentActivity"],"fullName":"CIA per-domain loaders (extracted modules) loadDocumentActivity drops zero-count rows for both document types and decisions","status":"passed","title":"drops zero-count rows for both document types and decisions","duration":1.154642000000024,"failureMessages":[],"location":{"line":169,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadRiskEvolution"],"fullName":"CIA per-domain loaders (extracted modules) loadRiskEvolution emits temporal risk entries with zero filtering","status":"passed","title":"emits temporal risk entries with zero filtering","duration":0.8705899999999929,"failureMessages":[],"location":{"line":190,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadCommitteeNetwork"],"fullName":"CIA per-domain loaders (extracted modules) loadCommitteeNetwork filters inactive committees with no measured output","status":"passed","title":"filters inactive committees with no measured output","duration":1.6591870000000313,"failureMessages":[],"location":{"line":207,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadPartyPerformance"],"fullName":"CIA per-domain loaders (extracted modules) loadPartyPerformance joins performance, metrics and momentum and sorts by seats","status":"passed","title":"joins performance, metrics and momentum and sorts by seats","duration":1.4610959999999977,"failureMessages":[],"location":{"line":233,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","loadTop10Influential"],"fullName":"CIA per-domain loaders (extracted modules) loadTop10Influential ranks MPs by network connections and joins risk data","status":"passed","title":"ranks MPs by network connections and joins risk data","duration":1.3274260000000027,"failureMessages":[],"location":{"line":263,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","createLoadCSV"],"fullName":"CIA per-domain loaders (extracted modules) createLoadCSV builds a working closure bound to URLs","status":"passed","title":"builds a working closure bound to URLs","duration":0.9237300000000346,"failureMessages":[],"location":{"line":288,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins /base/ + foo.csv -> /base/foo.csv","status":"passed","title":"joins /base/ + foo.csv -> /base/foo.csv","duration":0.4915009999999711,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins /base + foo.csv -> /base/foo.csv","status":"passed","title":"joins /base + foo.csv -> /base/foo.csv","duration":0.3769060000000195,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins /base/ + /foo.csv -> /base/foo.csv","status":"passed","title":"joins /base/ + /foo.csv -> /base/foo.csv","duration":0.480419999999981,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins /base + /foo.csv -> /base/foo.csv","status":"passed","title":"joins /base + /foo.csv -> /base/foo.csv","duration":0.41618900000003123,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins /base/// + ///foo.csv -> /base/foo.csv","status":"passed","title":"joins /base/// + ///foo.csv -> /base/foo.csv","duration":0.4747590000000059,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins ../cia-data/ + voting/x.csv -> ../cia-data/voting/x.csv","status":"passed","title":"joins ../cia-data/ + voting/x.csv -> ../cia-data/voting/x.csv","duration":0.397213000000022,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins https://host.example/path/ + x.csv -> https://host.example/path/x.csv","status":"passed","title":"joins https://host.example/path/ + x.csv -> https://host.example/path/x.csv","duration":0.42384299999997666,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL joins https://host.example/path + x.csv -> https://host.example/path/x.csv","status":"passed","title":"joins https://host.example/path + x.csv -> https://host.example/path/x.csv","duration":0.4458750000000009,"failureMessages":[],"location":{"line":317,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL returns the path when base is empty","status":"passed","title":"returns the path when base is empty","duration":0.5210759999999937,"failureMessages":[],"location":{"line":321,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["CIA per-domain loaders (extracted modules)","joinURL"],"fullName":"CIA per-domain loaders (extracted modules) joinURL returns the base when path is empty","status":"passed","title":"returns the base when path is empty","duration":0.45157599999998865,"failureMessages":[],"location":{"line":325,"column":5},"meta":{},"tags":[]}],"startTime":1787953808885,"endTime":1787953808913.4517,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-loaders.test.ts"},{"assertionResults":[{"ancestorTitles":["CIA sources configuration"],"fullName":"CIA sources configuration exposes a non-empty local path and description for every CSV source","status":"passed","title":"exposes a non-empty local path and description for every CSV source","duration":5.859040999999991,"failureMessages":[],"location":{"line":10,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA sources configuration"],"fullName":"CIA sources configuration uses unique local paths across all sources","status":"passed","title":"uses unique local paths across all sources","duration":0.5655790000000138,"failureMessages":[],"location":{"line":24,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA sources configuration"],"fullName":"CIA sources configuration declares the 8 Swedish Riksdag parties","status":"passed","title":"declares the 8 Swedish Riksdag parties","duration":1.102354000000048,"failureMessages":[],"location":{"line":30,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA sources configuration"],"fullName":"CIA sources configuration maps committee names to short org codes","status":"passed","title":"maps committee names to short org codes","duration":0.4724050000000375,"failureMessages":[],"location":{"line":34,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA sources configuration"],"fullName":"CIA sources configuration exposes a positive committee meetings divisor","status":"passed","title":"exposes a positive committee meetings divisor","duration":0.5141619999999989,"failureMessages":[],"location":{"line":41,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["CIA sources configuration"],"fullName":"CIA sources configuration deep-freezes the shared source inventory so consumers cannot mutate it","status":"passed","title":"deep-freezes the shared source inventory so consumers cannot mutate it","duration":0.9006559999999695,"failureMessages":[],"location":{"line":46,"column":3},"meta":{},"tags":[]}],"startTime":1787953924296,"endTime":1787953924305.9006,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/cia-sources.test.ts"},{"assertionResults":[{"ancestorTitles":["Coalition Dashboard","DOM Structure"],"fullName":"Coalition Dashboard DOM Structure should have coalition dashboard section","status":"passed","title":"should have coalition dashboard section","duration":10.454502999999988,"failureMessages":[],"location":{"line":61,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","DOM Structure"],"fullName":"Coalition Dashboard DOM Structure should have dashboard-container class","status":"passed","title":"should have dashboard-container class","duration":2.4135879999999474,"failureMessages":[],"location":{"line":66,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","DOM Structure"],"fullName":"Coalition Dashboard DOM Structure should have all chart canvases","status":"passed","title":"should have all chart canvases","duration":1.9787750000000415,"failureMessages":[],"location":{"line":70,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","DOM Structure"],"fullName":"Coalition Dashboard DOM Structure should have D3.js visualization containers","status":"passed","title":"should have D3.js visualization containers","duration":1.8419289999999933,"failureMessages":[],"location":{"line":76,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","DOM Structure"],"fullName":"Coalition Dashboard DOM Structure should have wide chart cards","status":"passed","title":"should have wide chart cards","duration":4.069899000000021,"failureMessages":[],"location":{"line":81,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","DOM Structure"],"fullName":"Coalition Dashboard DOM Structure should have data attribution","status":"passed","title":"should have data attribution","duration":2.8794809999999984,"failureMessages":[],"location":{"line":86,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Accessibility"],"fullName":"Coalition Dashboard Accessibility should have ARIA labels on D3 containers","status":"passed","title":"should have ARIA labels on D3 containers","duration":2.2855090000000473,"failureMessages":[],"location":{"line":93,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Accessibility"],"fullName":"Coalition Dashboard Accessibility should have accessible fallback table for network","status":"passed","title":"should have accessible fallback table for network","duration":1.8975730000000226,"failureMessages":[],"location":{"line":99,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Accessibility"],"fullName":"Coalition Dashboard Accessibility should have table caption","status":"passed","title":"should have table caption","duration":2.8904210000000035,"failureMessages":[],"location":{"line":105,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Accessibility"],"fullName":"Coalition Dashboard Accessibility should have proper heading hierarchy","status":"passed","title":"should have proper heading hierarchy","duration":1.8196169999999938,"failureMessages":[],"location":{"line":111,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Data Source Configuration"],"fullName":"Coalition Dashboard Data Source Configuration should configure local-first URLs for all CSV files","status":"passed","title":"should configure local-first URLs for all CSV files","duration":2.158811999999955,"failureMessages":[],"location":{"line":120,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Data Source Configuration"],"fullName":"Coalition Dashboard Data Source Configuration should use local paths starting with cia-data/","status":"passed","title":"should use local paths starting with cia-data/","duration":2.4612879999999677,"failureMessages":[],"location":{"line":133,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Data Source Configuration"],"fullName":"Coalition Dashboard Data Source Configuration should have remote fallback URLs for all files","status":"passed","title":"should have remote fallback URLs for all files","duration":2.5325109999999995,"failureMessages":[],"location":{"line":149,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Coalition Data Processing (Real CSV Schema)"],"fullName":"Coalition Dashboard Coalition Data Processing (Real CSV Schema) should parse behavioral patterns CSV with real columns","status":"passed","title":"should parse behavioral patterns CSV with real columns","duration":2.4530429999999797,"failureMessages":[],"location":{"line":169,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Coalition Data Processing (Real CSV Schema)"],"fullName":"Coalition Dashboard Coalition Data Processing (Real CSV Schema) should parse annual party votes CSV with real columns","status":"passed","title":"should parse annual party votes CSV with real columns","duration":4.121165000000019,"failureMessages":[],"location":{"line":180,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Coalition Data Processing (Real CSV Schema)"],"fullName":"Coalition Dashboard Coalition Data Processing (Real CSV Schema) should parse decision trends CSV with real columns","status":"passed","title":"should parse decision trends CSV with real columns","duration":1.1980429999999842,"failureMessages":[],"location":{"line":193,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Coalition Data Processing (Real CSV Schema)"],"fullName":"Coalition Dashboard Coalition Data Processing (Real CSV Schema) should parse decision patterns CSV with real columns","status":"passed","title":"should parse decision patterns CSV with real columns","duration":1.1935750000000098,"failureMessages":[],"location":{"line":204,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Coalition Data Processing (Real CSV Schema)"],"fullName":"Coalition Dashboard Coalition Data Processing (Real CSV Schema) should calculate alignment scores between parties","status":"passed","title":"should calculate alignment scores between parties","duration":1.6105459999999994,"failureMessages":[],"location":{"line":215,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Coalition Data Processing (Real CSV Schema)"],"fullName":"Coalition Dashboard Coalition Data Processing (Real CSV Schema) should identify coalition blocs","status":"passed","title":"should identify coalition blocs","duration":1.5336020000000872,"failureMessages":[],"location":{"line":224,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Coalition Data Processing (Real CSV Schema)"],"fullName":"Coalition Dashboard Coalition Data Processing (Real CSV Schema) should aggregate behavioral data by party","status":"passed","title":"should aggregate behavioral data by party","duration":1.7860729999999876,"failureMessages":[],"location":{"line":232,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","D3.js Network"],"fullName":"Coalition Dashboard D3.js Network should prepare network data nodes for all 8 parties","status":"passed","title":"should prepare network data nodes for all 8 parties","duration":2.258919999999989,"failureMessages":[],"location":{"line":254,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","D3.js Network"],"fullName":"Coalition Dashboard D3.js Network should prepare network data links","status":"passed","title":"should prepare network data links","duration":1.980848999999921,"failureMessages":[],"location":{"line":261,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","D3.js Network"],"fullName":"Coalition Dashboard D3.js Network should generate correct number of links for 8 parties","status":"passed","title":"should generate correct number of links for 8 parties","duration":1.4504450000000588,"failureMessages":[],"location":{"line":271,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Error Handling and Fallbacks"],"fullName":"Coalition Dashboard Error Handling and Fallbacks should handle empty CSV data gracefully","status":"passed","title":"should handle empty CSV data gracefully","duration":1.3546360000000277,"failureMessages":[],"location":{"line":279,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Error Handling and Fallbacks"],"fullName":"Coalition Dashboard Error Handling and Fallbacks should provide fallback coalition data when CSV is empty","status":"passed","title":"should provide fallback coalition data when CSV is empty","duration":1.635691999999949,"failureMessages":[],"location":{"line":287,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Error Handling and Fallbacks"],"fullName":"Coalition Dashboard Error Handling and Fallbacks should handle fetch failures with mock fallback","status":"passed","title":"should handle fetch failures with mock fallback","duration":2.336824999999976,"failureMessages":[],"location":{"line":308,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Error Handling and Fallbacks"],"fullName":"Coalition Dashboard Error Handling and Fallbacks should skip aggregate rows with party \"-\"","status":"passed","title":"should skip aggregate rows with party \"-\"","duration":1.4924139999999397,"failureMessages":[],"location":{"line":322,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Loading State"],"fullName":"Coalition Dashboard Loading State should add loading class to container","status":"passed","title":"should add loading class to container","duration":1.7877069999999549,"failureMessages":[],"location":{"line":334,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Loading State"],"fullName":"Coalition Dashboard Loading State should remove loading class when data loads","status":"passed","title":"should remove loading class when data loads","duration":1.640090999999984,"failureMessages":[],"location":{"line":339,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Alignment Rate Data Processing"],"fullName":"Coalition Dashboard Alignment Rate Data Processing should use alignment_rate directly as 0-1 scale without dividing by 100","status":"passed","title":"should use alignment_rate directly as 0-1 scale without dividing by 100","duration":1.6358519999999999,"failureMessages":[],"location":{"line":347,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Alignment Rate Data Processing"],"fullName":"Coalition Dashboard Alignment Rate Data Processing should handle reverse-pair lookups when CSV stores only one direction","status":"passed","title":"should handle reverse-pair lookups when CSV stores only one direction","duration":1.6304829999999129,"failureMessages":[],"location":{"line":363,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Alignment Rate Data Processing"],"fullName":"Coalition Dashboard Alignment Rate Data Processing should NOT divide alignment_rate by 100 (values are already 0-1)","status":"passed","title":"should NOT divide alignment_rate by 100 (values are already 0-1)","duration":1.7419909999999845,"failureMessages":[],"location":{"line":379,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Alignment Rate Data Processing"],"fullName":"Coalition Dashboard Alignment Rate Data Processing should calculate node influence correctly with 0-1 alignment rates","status":"passed","title":"should calculate node influence correctly with 0-1 alignment rates","duration":2.0492169999999987,"failureMessages":[],"location":{"line":393,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Alignment Rate Data Processing"],"fullName":"Coalition Dashboard Alignment Rate Data Processing should treat alignment value of 0 as valid, not fall back to 0.5","status":"passed","title":"should treat alignment value of 0 as valid, not fall back to 0.5","duration":4.7644599999999855,"failureMessages":[],"location":{"line":404,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Alignment Rate Data Processing"],"fullName":"Coalition Dashboard Alignment Rate Data Processing should fall back to 0.5 only for missing alignment data","status":"passed","title":"should fall back to 0.5 only for missing alignment data","duration":1.1118910000000142,"failureMessages":[],"location":{"line":412,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Alignment Rate Data Processing"],"fullName":"Coalition Dashboard Alignment Rate Data Processing should filter out non-party rows (e.g., party \"-\") when building alignment matrix","status":"passed","title":"should filter out non-party rows (e.g., party \"-\") when building alignment matrix","duration":1.335369999999898,"failureMessages":[],"location":{"line":419,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Mock Data Quality"],"fullName":"Coalition Dashboard Mock Data Quality should generate deterministic non-empty mock anomaly data for all parties","status":"passed","title":"should generate deterministic non-empty mock anomaly data for all parties","duration":2.4925369999999702,"failureMessages":[],"location":{"line":452,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Coalition Dashboard","Mock Data Quality"],"fullName":"Coalition Dashboard Mock Data Quality should generate deterministic non-empty mock annual votes data","status":"passed","title":"should generate deterministic non-empty mock annual votes data","duration":2.8199299999999994,"failureMessages":[],"location":{"line":468,"column":5},"meta":{},"tags":[]}],"startTime":1787953680216,"endTime":1787953680305.8198,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/coalition-dashboard.test.js"},{"assertionResults":[{"ancestorTitles":["Committees Dashboard","DOM Structure"],"fullName":"Committees Dashboard DOM Structure should have committee dashboard section","status":"passed","title":"should have committee dashboard section","duration":10.874983999999984,"failureMessages":[],"location":{"line":66,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","DOM Structure"],"fullName":"Committees Dashboard DOM Structure should have dashboard-container class","status":"passed","title":"should have dashboard-container class","duration":2.4933090000000107,"failureMessages":[],"location":{"line":71,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","DOM Structure"],"fullName":"Committees Dashboard DOM Structure should have all chart canvases","status":"passed","title":"should have all chart canvases","duration":2.464104999999961,"failureMessages":[],"location":{"line":75,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","DOM Structure"],"fullName":"Committees Dashboard DOM Structure should have D3 visualization containers","status":"passed","title":"should have D3 visualization containers","duration":2.269820999999979,"failureMessages":[],"location":{"line":81,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","DOM Structure"],"fullName":"Committees Dashboard DOM Structure should have wide chart cards","status":"passed","title":"should have wide chart cards","duration":4.968635000000006,"failureMessages":[],"location":{"line":86,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","DOM Structure"],"fullName":"Committees Dashboard DOM Structure should have last updated timestamp","status":"passed","title":"should have last updated timestamp","duration":2.475174999999979,"failureMessages":[],"location":{"line":91,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Accessibility"],"fullName":"Committees Dashboard Accessibility should have ARIA labels on D3 containers","status":"passed","title":"should have ARIA labels on D3 containers","duration":2.763695000000041,"failureMessages":[],"location":{"line":98,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Accessibility"],"fullName":"Committees Dashboard Accessibility should have accessible fallback tables","status":"passed","title":"should have accessible fallback tables","duration":2.381779999999992,"failureMessages":[],"location":{"line":107,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Accessibility"],"fullName":"Committees Dashboard Accessibility should have table captions","status":"passed","title":"should have table captions","duration":2.749479000000008,"failureMessages":[],"location":{"line":116,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Accessibility"],"fullName":"Committees Dashboard Accessibility should have proper heading hierarchy","status":"passed","title":"should have proper heading hierarchy","duration":3.2991180000000213,"failureMessages":[],"location":{"line":124,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Committee Data Processing"],"fullName":"Committees Dashboard Committee Data Processing should parse committee productivity matrix CSV with real columns","status":"passed","title":"should parse committee productivity matrix CSV with real columns","duration":3.0706900000000132,"failureMessages":[],"location":{"line":133,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Committee Data Processing"],"fullName":"Committees Dashboard Committee Data Processing should parse committee ballot decision summary CSV with real columns","status":"passed","title":"should parse committee ballot decision summary CSV with real columns","duration":2.044828999999993,"failureMessages":[],"location":{"line":144,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Committee Data Processing"],"fullName":"Committees Dashboard Committee Data Processing should rank committees by effectiveness","status":"passed","title":"should rank committees by effectiveness","duration":2.114629999999977,"failureMessages":[],"location":{"line":154,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Committee Data Processing"],"fullName":"Committees Dashboard Committee Data Processing should calculate productivity metrics","status":"passed","title":"should calculate productivity metrics","duration":1.8494329999999763,"failureMessages":[],"location":{"line":165,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Data Source Configuration"],"fullName":"Committees Dashboard Data Source Configuration should use local-first URLs with cia-data/ prefix","status":"passed","title":"should use local-first URLs with cia-data/ prefix","duration":2.0797750000000406,"failureMessages":[],"location":{"line":174,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Data Source Configuration"],"fullName":"Committees Dashboard Data Source Configuration should have remote fallback URLs","status":"passed","title":"should have remote fallback URLs","duration":2.0787329999999997,"failureMessages":[],"location":{"line":186,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Error Handling"],"fullName":"Committees Dashboard Error Handling should handle empty CSV data","status":"passed","title":"should handle empty CSV data","duration":1.7472420000000284,"failureMessages":[],"location":{"line":194,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Error Handling"],"fullName":"Committees Dashboard Error Handling should handle fetch failures gracefully","status":"passed","title":"should handle fetch failures gracefully","duration":2.4041220000000294,"failureMessages":[],"location":{"line":200,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Chart Configuration"],"fullName":"Committees Dashboard Chart Configuration should create comparison bar chart","status":"passed","title":"should create comparison bar chart","duration":4.823381999999981,"failureMessages":[],"location":{"line":213,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Data Attribution"],"fullName":"Committees Dashboard Data Attribution should have data attribution section","status":"passed","title":"should have data attribution section","duration":1.5842670000000112,"failureMessages":[],"location":{"line":228,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Committees Dashboard","Data Attribution"],"fullName":"Committees Dashboard Data Attribution should reference CIA Platform as data source","status":"passed","title":"should reference CIA Platform as data source","duration":1.5518659999999613,"failureMessages":[],"location":{"line":233,"column":5},"meta":{},"tags":[]}],"startTime":1787953832936,"endTime":1787953832998.5518,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/committees-dashboard.test.js"},{"assertionResults":[{"ancestorTitles":["contract-checker: windows"],"fullName":"contract-checker: windows maps all 14 contract languages plus the BCP-47 `nb` alias for Norwegian","status":"passed","title":"maps all 14 contract languages plus the BCP-47 `nb` alias for Norwegian","duration":4.200203999999985,"failureMessages":[],"location":{"line":48,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: windows"],"fullName":"contract-checker: windows applies Latin window for unknown language","status":"passed","title":"applies Latin window for unknown language","duration":1.2209060000000136,"failureMessages":[],"location":{"line":59,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: windows"],"fullName":"contract-checker: windows uses tighter CJK windows","status":"passed","title":"uses tighter CJK windows","duration":0.5728630000000408,"failureMessages":[],"location":{"line":63,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: windows"],"fullName":"contract-checker: windows uses tighter RTL windows","status":"passed","title":"uses tighter RTL windows","duration":0.4970209999999611,"failureMessages":[],"location":{"line":69,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title length"],"fullName":"contract-checker: title length PASS — title exactly at lower bound","status":"passed","title":"PASS — title exactly at lower bound","duration":1.3563699999999699,"failureMessages":[],"location":{"line":77,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title length"],"fullName":"contract-checker: title length FAIL — title below lower bound","status":"passed","title":"FAIL — title below lower bound","duration":0.7924339999999575,"failureMessages":[],"location":{"line":85,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title length"],"fullName":"contract-checker: title length FAIL — title above upper bound","status":"passed","title":"FAIL — title above upper bound","duration":0.7686089999999695,"failureMessages":[],"location":{"line":94,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title length"],"fullName":"contract-checker: title length FAIL — empty title","status":"passed","title":"FAIL — empty title","duration":0.5629339999999843,"failureMessages":[],"location":{"line":103,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title banned phrases"],"fullName":"contract-checker: title banned phrases FAIL — literal YYYY-MM-DD in title","status":"passed","title":"FAIL — literal YYYY-MM-DD in title","duration":0.6891299999999774,"failureMessages":[],"location":{"line":116,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title banned phrases"],"fullName":"contract-checker: title banned phrases FAIL — trailing brand suffix in title","status":"passed","title":"FAIL — trailing brand suffix in title","duration":1.0378029999999967,"failureMessages":[],"location":{"line":124,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title banned phrases"],"fullName":"contract-checker: title banned phrases FAIL — Executive Brief boilerplate prefix","status":"passed","title":"FAIL — Executive Brief boilerplate prefix","duration":0.6132790000000341,"failureMessages":[],"location":{"line":132,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title banned phrases"],"fullName":"contract-checker: title banned phrases FAIL — AI-generated filler phrase in title","status":"passed","title":"FAIL — AI-generated filler phrase in title","duration":0.47876600000000735,"failureMessages":[],"location":{"line":140,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title banned phrases"],"fullName":"contract-checker: title banned phrases FAIL — Brief ID leak in title","status":"passed","title":"FAIL — Brief ID leak in title","duration":0.5191319999999564,"failureMessages":[],"location":{"line":148,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: title banned phrases"],"fullName":"contract-checker: title banned phrases PASS — clean title","status":"passed","title":"PASS — clean title","duration":0.573914000000002,"failureMessages":[],"location":{"line":156,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules PASS — description at lower bound, terminated","status":"passed","title":"PASS — description at lower bound, terminated","duration":0.5907659999999737,"failureMessages":[],"location":{"line":170,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — description below lower bound","status":"passed","title":"FAIL — description below lower bound","duration":0.5674220000000219,"failureMessages":[],"location":{"line":180,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — description above upper bound","status":"passed","title":"FAIL — description above upper bound","duration":0.538739000000021,"failureMessages":[],"location":{"line":188,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — description empty","status":"passed","title":"FAIL — description empty","duration":0.5294109999999819,"failureMessages":[],"location":{"line":197,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — description ends mid-word","status":"passed","title":"FAIL — description ends mid-word","duration":1.1411170000000084,"failureMessages":[],"location":{"line":205,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules PASS — ellipsis is an accepted terminator","status":"passed","title":"PASS — ellipsis is an accepted terminator","duration":0.9453100000000063,"failureMessages":[],"location":{"line":215,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules PASS — CJK full stop 。 is an accepted terminator","status":"passed","title":"PASS — CJK full stop 。 is an accepted terminator","duration":0.6684420000000273,"failureMessages":[],"location":{"line":224,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — admin leak (Brief ID)","status":"passed","title":"FAIL — admin leak (Brief ID)","duration":0.5419049999999856,"failureMessages":[],"location":{"line":233,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — admin leak (Prepared by)","status":"passed","title":"FAIL — admin leak (Prepared by)","duration":0.6143999999999892,"failureMessages":[],"location":{"line":242,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — admin leak (60-second read)","status":"passed","title":"FAIL — admin leak (60-second read)","duration":0.5724309999999946,"failureMessages":[],"location":{"line":251,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: description rules"],"fullName":"contract-checker: description rules FAIL — generic filler","status":"passed","title":"FAIL — generic filler","duration":0.5675529999999753,"failureMessages":[],"location":{"line":260,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: per-language windows"],"fullName":"contract-checker: per-language windows FAIL — 35-char German description is below floor","status":"passed","title":"FAIL — 35-char German description is below floor","duration":0.5887319999999931,"failureMessages":[],"location":{"line":271,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: per-language windows"],"fullName":"contract-checker: per-language windows FAIL — CJK tighter window catches 80-char Japanese title","status":"passed","title":"FAIL — CJK tighter window catches 80-char Japanese title","duration":0.687546999999995,"failureMessages":[],"location":{"line":283,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: per-language windows"],"fullName":"contract-checker: per-language windows PASS — 40-char Japanese title fits CJK window","status":"passed","title":"PASS — 40-char Japanese title fits CJK window","duration":0.6621499999999969,"failureMessages":[],"location":{"line":295,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: per-language windows"],"fullName":"contract-checker: per-language windows FAIL — RTL tighter window catches 100-char Arabic title","status":"passed","title":"FAIL — RTL tighter window catches 100-char Arabic title","duration":0.6460389999999734,"failureMessages":[],"location":{"line":308,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: regex corpus"],"fullName":"contract-checker: regex corpus BANNED_TITLE_PHRASES covers §2.2 list","status":"passed","title":"BANNED_TITLE_PHRASES covers §2.2 list","duration":0.5937620000000265,"failureMessages":[],"location":{"line":322,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: regex corpus"],"fullName":"contract-checker: regex corpus BANNED_DESCRIPTION_PHRASES covers §3.1 list","status":"passed","title":"BANNED_DESCRIPTION_PHRASES covers §3.1 list","duration":0.7861420000000408,"failureMessages":[],"location":{"line":325,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: regex corpus"],"fullName":"contract-checker: regex corpus ISO_DATE_RE matches canonical forms","status":"passed","title":"ISO_DATE_RE matches canonical forms","duration":0.9189709999999991,"failureMessages":[],"location":{"line":328,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: regex corpus"],"fullName":"contract-checker: regex corpus TRAILING_BRAND_RE matches trailing \" — Riksdagsmonitor\"","status":"passed","title":"TRAILING_BRAND_RE matches trailing \" — Riksdagsmonitor\"","duration":0.6783110000000079,"failureMessages":[],"location":{"line":333,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: regex corpus"],"fullName":"contract-checker: regex corpus GENERIC_FILLER_RE matches contract-listed filler","status":"passed","title":"GENERIC_FILLER_RE matches contract-listed filler","duration":0.5632349999999633,"failureMessages":[],"location":{"line":338,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: regex corpus"],"fullName":"contract-checker: regex corpus SENTENCE_TERMINATOR_RE accepts each multi-script terminator","status":"passed","title":"SENTENCE_TERMINATOR_RE accepts each multi-script terminator","duration":0.7895680000000311,"failureMessages":[],"location":{"line":342,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: result shape"],"fullName":"contract-checker: result shape ok=true when no violations","status":"passed","title":"ok=true when no violations","duration":0.8247740000000476,"failureMessages":[],"location":{"line":353,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: result shape"],"fullName":"contract-checker: result shape ok=false iff violations.length > 0","status":"passed","title":"ok=false iff violations.length > 0","duration":0.7458359999999971,"failureMessages":[],"location":{"line":366,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["contract-checker: result shape"],"fullName":"contract-checker: result shape every violation has {code, field, message, value}","status":"passed","title":"every violation has {code, field, message, value}","duration":1.698178999999982,"failureMessages":[],"location":{"line":372,"column":3},"meta":{},"tags":[]}],"startTime":1787953789986,"endTime":1787953790018.6982,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/contract-checker.test.ts"},{"assertionResults":[{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_politician_risk_levels.csv","status":"passed","title":"should have distribution_politician_risk_levels.csv","duration":3.8710179999999923,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_risk_by_party.csv","status":"passed","title":"should have distribution_risk_by_party.csv","duration":0.5642770000000041,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_risk_evolution_temporal.csv","status":"passed","title":"should have distribution_risk_evolution_temporal.csv","duration":0.42115899999998874,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_crisis_resilience.csv","status":"passed","title":"should have distribution_crisis_resilience.csv","duration":0.46229600000003757,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have percentile_voting_anomaly_detection.csv","status":"passed","title":"should have percentile_voting_anomaly_detection.csv","duration":0.3382230000000277,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_party_effectiveness_trends.csv","status":"passed","title":"should have distribution_party_effectiveness_trends.csv","duration":0.4349040000000173,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_party_momentum.csv","status":"passed","title":"should have distribution_party_momentum.csv","duration":0.35641700000002174,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_annual_committee_documents.csv","status":"passed","title":"should have distribution_annual_committee_documents.csv","duration":0.30551200000002154,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_committee_productivity_matrix.csv","status":"passed","title":"should have distribution_committee_productivity_matrix.csv","duration":0.5624429999999734,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_ministry_effectiveness.csv","status":"passed","title":"should have distribution_ministry_effectiveness.csv","duration":0.31880599999999504,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_ministry_decision_impact.csv","status":"passed","title":"should have distribution_ministry_decision_impact.csv","duration":0.35458399999998846,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_ministry_productivity_matrix.csv","status":"passed","title":"should have distribution_ministry_productivity_matrix.csv","duration":0.3374109999999746,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_ministry_risk_levels.csv","status":"passed","title":"should have distribution_ministry_risk_levels.csv","duration":0.27993299999997134,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_ministry_risk_quarterly.csv","status":"passed","title":"should have distribution_ministry_risk_quarterly.csv","duration":0.31534099999998944,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_person_status.csv","status":"passed","title":"should have distribution_person_status.csv","duration":0.47895600000003924,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_experience_levels.csv","status":"passed","title":"should have distribution_experience_levels.csv","duration":0.43832099999997354,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have distribution_experience_by_party.csv","status":"passed","title":"should have distribution_experience_by_party.csv","duration":0.44853999999997995,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Existence"],"fullName":"CIA CSV Data Validation File Existence should have extraction_summary_report.csv","status":"passed","title":"should have extraction_summary_report.csv","duration":0.3714659999999981,"failureMessages":[],"location":{"line":114,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_politician_risk_levels.csv should not be empty or too small","status":"passed","title":"distribution_politician_risk_levels.csv should not be empty or too small","duration":0.6662580000000276,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_risk_by_party.csv should not be empty or too small","status":"passed","title":"distribution_risk_by_party.csv should not be empty or too small","duration":0.5359129999999936,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_risk_evolution_temporal.csv should not be empty or too small","status":"passed","title":"distribution_risk_evolution_temporal.csv should not be empty or too small","duration":0.4872530000000097,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_crisis_resilience.csv should not be empty or too small","status":"passed","title":"distribution_crisis_resilience.csv should not be empty or too small","duration":0.5251930000000016,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation percentile_voting_anomaly_detection.csv should not be empty or too small","status":"passed","title":"percentile_voting_anomaly_detection.csv should not be empty or too small","duration":0.45837899999997944,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_party_effectiveness_trends.csv should not be empty or too small","status":"passed","title":"distribution_party_effectiveness_trends.csv should not be empty or too small","duration":0.4967100000000073,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_party_momentum.csv should not be empty or too small","status":"passed","title":"distribution_party_momentum.csv should not be empty or too small","duration":0.4698900000000208,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_annual_committee_documents.csv should not be empty or too small","status":"passed","title":"distribution_annual_committee_documents.csv should not be empty or too small","duration":0.4833849999999984,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_committee_productivity_matrix.csv should not be empty or too small","status":"passed","title":"distribution_committee_productivity_matrix.csv should not be empty or too small","duration":0.49516700000003766,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_ministry_effectiveness.csv should not be empty or too small","status":"passed","title":"distribution_ministry_effectiveness.csv should not be empty or too small","duration":0.46988000000004604,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_ministry_decision_impact.csv should not be empty or too small","status":"passed","title":"distribution_ministry_decision_impact.csv should not be empty or too small","duration":0.44942200000002686,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_ministry_productivity_matrix.csv should not be empty or too small","status":"passed","title":"distribution_ministry_productivity_matrix.csv should not be empty or too small","duration":0.5209650000000465,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_ministry_risk_levels.csv should not be empty or too small","status":"passed","title":"distribution_ministry_risk_levels.csv should not be empty or too small","duration":0.6449980000000437,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_ministry_risk_quarterly.csv should not be empty or too small","status":"passed","title":"distribution_ministry_risk_quarterly.csv should not be empty or too small","duration":0.7723659999999768,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_person_status.csv should not be empty or too small","status":"passed","title":"distribution_person_status.csv should not be empty or too small","duration":0.5570119999999861,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_experience_levels.csv should not be empty or too small","status":"passed","title":"distribution_experience_levels.csv should not be empty or too small","duration":0.5136309999999753,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation distribution_experience_by_party.csv should not be empty or too small","status":"passed","title":"distribution_experience_by_party.csv should not be empty or too small","duration":0.5486779999999953,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","File Size Validation"],"fullName":"CIA CSV Data Validation File Size Validation extraction_summary_report.csv should not be empty or too small","status":"passed","title":"extraction_summary_report.csv should not be empty or too small","duration":0.5166580000000067,"failureMessages":[],"location":{"line":123,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_politician_risk_levels.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_politician_risk_levels.csv should have valid UTF-8 encoding","duration":0.8567639999999983,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_risk_by_party.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_risk_by_party.csv should have valid UTF-8 encoding","duration":0.6430139999999938,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_risk_evolution_temporal.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_risk_evolution_temporal.csv should have valid UTF-8 encoding","duration":0.6454289999999787,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_crisis_resilience.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_crisis_resilience.csv should have valid UTF-8 encoding","duration":0.579435999999987,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation percentile_voting_anomaly_detection.csv should have valid UTF-8 encoding","status":"passed","title":"percentile_voting_anomaly_detection.csv should have valid UTF-8 encoding","duration":0.6480830000000424,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_party_effectiveness_trends.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_party_effectiveness_trends.csv should have valid UTF-8 encoding","duration":0.8558929999999805,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_party_momentum.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_party_momentum.csv should have valid UTF-8 encoding","duration":0.7095590000000129,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_annual_committee_documents.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_annual_committee_documents.csv should have valid UTF-8 encoding","duration":0.7976340000000164,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_committee_productivity_matrix.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_committee_productivity_matrix.csv should have valid UTF-8 encoding","duration":0.8485180000000128,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_ministry_effectiveness.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_ministry_effectiveness.csv should have valid UTF-8 encoding","duration":0.7251279999999838,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_ministry_decision_impact.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_ministry_decision_impact.csv should have valid UTF-8 encoding","duration":0.7996070000000373,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_ministry_productivity_matrix.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_ministry_productivity_matrix.csv should have valid UTF-8 encoding","duration":0.7187660000000164,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_ministry_risk_levels.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_ministry_risk_levels.csv should have valid UTF-8 encoding","duration":0.8750580000000241,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_ministry_risk_quarterly.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_ministry_risk_quarterly.csv should have valid UTF-8 encoding","duration":0.8248539999999593,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_person_status.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_person_status.csv should have valid UTF-8 encoding","duration":0.7819339999999784,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_experience_levels.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_experience_levels.csv should have valid UTF-8 encoding","duration":0.7919630000000097,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation distribution_experience_by_party.csv should have valid UTF-8 encoding","status":"passed","title":"distribution_experience_by_party.csv should have valid UTF-8 encoding","duration":6.173889999999972,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Encoding Validation"],"fullName":"CIA CSV Data Validation Encoding Validation extraction_summary_report.csv should have valid UTF-8 encoding","status":"passed","title":"extraction_summary_report.csv should have valid UTF-8 encoding","duration":0.7315490000000295,"failureMessages":[],"location":{"line":158,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_politician_risk_levels.csv should have proper CSV structure","status":"passed","title":"distribution_politician_risk_levels.csv should have proper CSV structure","duration":0.9320950000000039,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_politician_risk_levels.csv should have data rows","status":"passed","title":"distribution_politician_risk_levels.csv should have data rows","duration":0.7083659999999554,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_risk_by_party.csv should have proper CSV structure","status":"passed","title":"distribution_risk_by_party.csv should have proper CSV structure","duration":0.7103500000000622,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_risk_by_party.csv should have data rows","status":"passed","title":"distribution_risk_by_party.csv should have data rows","duration":0.9374450000000252,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_risk_evolution_temporal.csv should have proper CSV structure","status":"passed","title":"distribution_risk_evolution_temporal.csv should have proper CSV structure","duration":1.0824159999999665,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_risk_evolution_temporal.csv should have data rows","status":"passed","title":"distribution_risk_evolution_temporal.csv should have data rows","duration":0.6940989999999374,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_crisis_resilience.csv should have proper CSV structure","status":"passed","title":"distribution_crisis_resilience.csv should have proper CSV structure","duration":0.6727290000000039,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_crisis_resilience.csv should have data rows","status":"passed","title":"distribution_crisis_resilience.csv should have data rows","duration":0.6914040000000341,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation percentile_voting_anomaly_detection.csv should have proper CSV structure","status":"passed","title":"percentile_voting_anomaly_detection.csv should have proper CSV structure","duration":0.7259999999999991,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation percentile_voting_anomaly_detection.csv should have data rows","status":"passed","title":"percentile_voting_anomaly_detection.csv should have data rows","duration":0.6845610000000306,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_party_effectiveness_trends.csv should have proper CSV structure","status":"passed","title":"distribution_party_effectiveness_trends.csv should have proper CSV structure","duration":0.7502550000000383,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_party_effectiveness_trends.csv should have data rows","status":"passed","title":"distribution_party_effectiveness_trends.csv should have data rows","duration":0.7409770000000435,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_party_momentum.csv should have proper CSV structure","status":"passed","title":"distribution_party_momentum.csv should have proper CSV structure","duration":0.821749000000068,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_party_momentum.csv should have data rows","status":"passed","title":"distribution_party_momentum.csv should have data rows","duration":0.9089409999999134,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_annual_committee_documents.csv should have proper CSV structure","status":"passed","title":"distribution_annual_committee_documents.csv should have proper CSV structure","duration":1.0364210000000185,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_annual_committee_documents.csv should have data rows","status":"passed","title":"distribution_annual_committee_documents.csv should have data rows","duration":0.8401229999999487,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_committee_productivity_matrix.csv should have proper CSV structure","status":"passed","title":"distribution_committee_productivity_matrix.csv should have proper CSV structure","duration":0.8510629999999537,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_committee_productivity_matrix.csv should have data rows","status":"passed","title":"distribution_committee_productivity_matrix.csv should have data rows","duration":0.8053979999999683,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_effectiveness.csv should have proper CSV structure","status":"passed","title":"distribution_ministry_effectiveness.csv should have proper CSV structure","duration":0.9363440000000764,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_effectiveness.csv should have data rows","status":"passed","title":"distribution_ministry_effectiveness.csv should have data rows","duration":0.8712909999999283,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_decision_impact.csv should have proper CSV structure","status":"passed","title":"distribution_ministry_decision_impact.csv should have proper CSV structure","duration":0.9153840000000173,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_decision_impact.csv should have data rows","status":"passed","title":"distribution_ministry_decision_impact.csv should have data rows","duration":0.9091919999999618,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_productivity_matrix.csv should have proper CSV structure","status":"passed","title":"distribution_ministry_productivity_matrix.csv should have proper CSV structure","duration":0.9805660000000671,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_productivity_matrix.csv should have data rows","status":"passed","title":"distribution_ministry_productivity_matrix.csv should have data rows","duration":0.9442780000000539,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_risk_levels.csv should have proper CSV structure","status":"passed","title":"distribution_ministry_risk_levels.csv should have proper CSV structure","duration":1.1352759999999762,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_risk_levels.csv should have data rows","status":"passed","title":"distribution_ministry_risk_levels.csv should have data rows","duration":1.1937560000000076,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_risk_quarterly.csv should have proper CSV structure","status":"passed","title":"distribution_ministry_risk_quarterly.csv should have proper CSV structure","duration":1.0724880000000212,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_ministry_risk_quarterly.csv should have data rows","status":"passed","title":"distribution_ministry_risk_quarterly.csv should have data rows","duration":1.6020800000000008,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_person_status.csv should have proper CSV structure","status":"passed","title":"distribution_person_status.csv should have proper CSV structure","duration":2.024000000000001,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_person_status.csv should have data rows","status":"passed","title":"distribution_person_status.csv should have data rows","duration":1.4485019999999622,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_experience_levels.csv should have proper CSV structure","status":"passed","title":"distribution_experience_levels.csv should have proper CSV structure","duration":1.1116610000000264,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_experience_levels.csv should have data rows","status":"passed","title":"distribution_experience_levels.csv should have data rows","duration":1.059172999999987,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_experience_by_party.csv should have proper CSV structure","status":"passed","title":"distribution_experience_by_party.csv should have proper CSV structure","duration":1.097395000000006,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation distribution_experience_by_party.csv should have data rows","status":"passed","title":"distribution_experience_by_party.csv should have data rows","duration":1.057570999999939,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation extraction_summary_report.csv should have proper CSV structure","status":"passed","title":"extraction_summary_report.csv should have proper CSV structure","duration":1.1122219999999743,"failureMessages":[],"location":{"line":177,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","CSV Structure Validation"],"fullName":"CIA CSV Data Validation CSV Structure Validation extraction_summary_report.csv should have data rows","status":"passed","title":"extraction_summary_report.csv should have data rows","duration":1.1047379999999976,"failureMessages":[],"location":{"line":196,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_politician_risk_levels.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_politician_risk_levels.csv should exist and be parseable","status":"passed","title":"should exist and be parseable","duration":1.3934390000000576,"failureMessages":[],"location":{"line":214,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_politician_risk_levels.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_politician_risk_levels.csv should have required columns","status":"passed","title":"should have required columns","duration":2.021223999999961,"failureMessages":[],"location":{"line":226,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_politician_risk_levels.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_politician_risk_levels.csv should have valid numeric data types","status":"passed","title":"should have valid numeric data types","duration":1.4512680000000273,"failureMessages":[],"location":{"line":242,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_risk_by_party.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_risk_by_party.csv should exist and be parseable","status":"passed","title":"should exist and be parseable","duration":1.2187020000000075,"failureMessages":[],"location":{"line":214,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_risk_by_party.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_risk_by_party.csv should have required columns","status":"passed","title":"should have required columns","duration":1.4052410000000464,"failureMessages":[],"location":{"line":226,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_risk_by_party.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_risk_by_party.csv should have valid numeric data types","status":"passed","title":"should have valid numeric data types","duration":2.274519000000055,"failureMessages":[],"location":{"line":242,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_party_effectiveness_trends.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_party_effectiveness_trends.csv should exist and be parseable","status":"passed","title":"should exist and be parseable","duration":1.684423000000038,"failureMessages":[],"location":{"line":214,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_party_effectiveness_trends.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_party_effectiveness_trends.csv should have required columns","status":"passed","title":"should have required columns","duration":1.9128420000000688,"failureMessages":[],"location":{"line":226,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_party_effectiveness_trends.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_party_effectiveness_trends.csv should have valid numeric data types","status":"passed","title":"should have valid numeric data types","duration":5.685165000000097,"failureMessages":[],"location":{"line":242,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_ministry_effectiveness.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_ministry_effectiveness.csv should exist and be parseable","status":"passed","title":"should exist and be parseable","duration":2.208344000000011,"failureMessages":[],"location":{"line":214,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_ministry_effectiveness.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_ministry_effectiveness.csv should have required columns","status":"passed","title":"should have required columns","duration":3.0398119999999835,"failureMessages":[],"location":{"line":226,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_ministry_effectiveness.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_ministry_effectiveness.csv should have valid numeric data types","status":"passed","title":"should have valid numeric data types","duration":3.668309000000022,"failureMessages":[],"location":{"line":242,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_committee_productivity_matrix.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_committee_productivity_matrix.csv should exist and be parseable","status":"passed","title":"should exist and be parseable","duration":2.541488999999956,"failureMessages":[],"location":{"line":214,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_committee_productivity_matrix.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_committee_productivity_matrix.csv should have required columns","status":"passed","title":"should have required columns","duration":2.2808009999999967,"failureMessages":[],"location":{"line":226,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Schema Validation","distribution_committee_productivity_matrix.csv"],"fullName":"CIA CSV Data Validation Schema Validation distribution_committee_productivity_matrix.csv should have valid numeric data types","status":"passed","title":"should have valid numeric data types","duration":12.54633100000001,"failureMessages":[],"location":{"line":242,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_politician_risk_levels.csv should have consistent column counts","status":"passed","title":"distribution_politician_risk_levels.csv should have consistent column counts","duration":2.6686369999999897,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_risk_by_party.csv should have consistent column counts","status":"passed","title":"distribution_risk_by_party.csv should have consistent column counts","duration":2.2425589999999147,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_risk_evolution_temporal.csv should have consistent column counts","status":"passed","title":"distribution_risk_evolution_temporal.csv should have consistent column counts","duration":3.0915590000000748,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_crisis_resilience.csv should have consistent column counts","status":"passed","title":"distribution_crisis_resilience.csv should have consistent column counts","duration":2.265310999999997,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency percentile_voting_anomaly_detection.csv should have consistent column counts","status":"passed","title":"percentile_voting_anomaly_detection.csv should have consistent column counts","duration":1.9890850000000455,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_party_effectiveness_trends.csv should have consistent column counts","status":"passed","title":"distribution_party_effectiveness_trends.csv should have consistent column counts","duration":3.459206999999992,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_party_momentum.csv should have consistent column counts","status":"passed","title":"distribution_party_momentum.csv should have consistent column counts","duration":7.801216999999951,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_annual_committee_documents.csv should have consistent column counts","status":"passed","title":"distribution_annual_committee_documents.csv should have consistent column counts","duration":11.184652000000028,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_committee_productivity_matrix.csv should have consistent column counts","status":"passed","title":"distribution_committee_productivity_matrix.csv should have consistent column counts","duration":6.330152999999996,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_ministry_effectiveness.csv should have consistent column counts","status":"passed","title":"distribution_ministry_effectiveness.csv should have consistent column counts","duration":2.674147000000062,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_ministry_decision_impact.csv should have consistent column counts","status":"passed","title":"distribution_ministry_decision_impact.csv should have consistent column counts","duration":2.2525779999999713,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_ministry_productivity_matrix.csv should have consistent column counts","status":"passed","title":"distribution_ministry_productivity_matrix.csv should have consistent column counts","duration":1.9710810000000265,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_ministry_risk_levels.csv should have consistent column counts","status":"passed","title":"distribution_ministry_risk_levels.csv should have consistent column counts","duration":1.6111069999999472,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_ministry_risk_quarterly.csv should have consistent column counts","status":"passed","title":"distribution_ministry_risk_quarterly.csv should have consistent column counts","duration":1.761908999999946,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_person_status.csv should have consistent column counts","status":"passed","title":"distribution_person_status.csv should have consistent column counts","duration":3.872090999999955,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_experience_levels.csv should have consistent column counts","status":"passed","title":"distribution_experience_levels.csv should have consistent column counts","duration":1.6840430000000879,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency distribution_experience_by_party.csv should have consistent column counts","status":"passed","title":"distribution_experience_by_party.csv should have consistent column counts","duration":2.059476000000018,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Column Consistency"],"fullName":"CIA CSV Data Validation Column Consistency extraction_summary_report.csv should have consistent column counts","status":"passed","title":"extraction_summary_report.csv should have consistent column counts","duration":3.421196000000009,"failureMessages":[],"location":{"line":268,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["CIA CSV Data Validation","Data Freshness"],"fullName":"CIA CSV Data Validation Data Freshness CSV files should not be older than 90 days (warns at 30 days)","status":"passed","title":"CSV files should not be older than 90 days (warns at 30 days)","duration":2.2340330000000677,"failureMessages":[],"location":{"line":300,"column":5},"meta":{},"tags":[]}],"startTime":1787953813933,"endTime":1787953814120.2341,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/csv-validation.test.js"},{"assertionResults":[{"ancestorTitles":["Dashboard bundle integrity (post-build)"],"fullName":"Dashboard bundle integrity (post-build) dist/dashboards/ directory exists","status":"skipped","title":"dist/dashboards/ directory exists","failureMessages":[],"location":{"line":56,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)"],"fullName":"Dashboard bundle integrity (post-build) dist/cia-data/ directory exists","status":"skipped","title":"dist/cia-data/ directory exists","failureMessages":[],"location":{"line":60,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","parties.html"],"fullName":"Dashboard bundle integrity (post-build) parties.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","parties.html"],"fullName":"Dashboard bundle integrity (post-build) parties.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","parties.html"],"fullName":"Dashboard bundle integrity (post-build) parties.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","pre-election.html"],"fullName":"Dashboard bundle integrity (post-build) pre-election.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","pre-election.html"],"fullName":"Dashboard bundle integrity (post-build) pre-election.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","pre-election.html"],"fullName":"Dashboard bundle integrity (post-build) pre-election.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","coalitions.html"],"fullName":"Dashboard bundle integrity (post-build) coalitions.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","coalitions.html"],"fullName":"Dashboard bundle integrity (post-build) coalitions.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","coalitions.html"],"fullName":"Dashboard bundle integrity (post-build) coalitions.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","committees.html"],"fullName":"Dashboard bundle integrity (post-build) committees.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","committees.html"],"fullName":"Dashboard bundle integrity (post-build) committees.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","committees.html"],"fullName":"Dashboard bundle integrity (post-build) committees.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","seasonal-patterns.html"],"fullName":"Dashboard bundle integrity (post-build) seasonal-patterns.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","seasonal-patterns.html"],"fullName":"Dashboard bundle integrity (post-build) seasonal-patterns.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","seasonal-patterns.html"],"fullName":"Dashboard bundle integrity (post-build) seasonal-patterns.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","anomaly-detection.html"],"fullName":"Dashboard bundle integrity (post-build) anomaly-detection.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","anomaly-detection.html"],"fullName":"Dashboard bundle integrity (post-build) anomaly-detection.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","anomaly-detection.html"],"fullName":"Dashboard bundle integrity (post-build) anomaly-detection.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","risk.html"],"fullName":"Dashboard bundle integrity (post-build) risk.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","risk.html"],"fullName":"Dashboard bundle integrity (post-build) risk.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","risk.html"],"fullName":"Dashboard bundle integrity (post-build) risk.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","ministers.html"],"fullName":"Dashboard bundle integrity (post-build) ministers.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","ministers.html"],"fullName":"Dashboard bundle integrity (post-build) ministers.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","ministers.html"],"fullName":"Dashboard bundle integrity (post-build) ministers.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","election-cycle.html"],"fullName":"Dashboard bundle integrity (post-build) election-cycle.html exists in dist/dashboards/","status":"skipped","title":"exists in dist/dashboards/","failureMessages":[],"location":{"line":68,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","election-cycle.html"],"fullName":"Dashboard bundle integrity (post-build) election-cycle.html contains hashed main-*.js bundle (not dev /src/browser/main.ts)","status":"skipped","title":"contains hashed main-*.js bundle (not dev /src/browser/main.ts)","failureMessages":[],"location":{"line":72,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","election-cycle.html"],"fullName":"Dashboard bundle integrity (post-build) election-cycle.html has correctly rewritten stylesheet href (stable assets/styles.css path)","status":"skipped","title":"has correctly rewritten stylesheet href (stable assets/styles.css path)","failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)"],"fullName":"Dashboard bundle integrity (post-build) all localized dashboard pages also have hashed bundles","status":"skipped","title":"all localized dashboard pages also have hashed bundles","failureMessages":[],"location":{"line":109,"column":3},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","CIA dashboard hub bundle (dashboard/index.html)"],"fullName":"Dashboard bundle integrity (post-build) CIA dashboard hub bundle (dashboard/index.html) dashboard/index.html exists and ships a hashed cia-entry bundle","status":"skipped","title":"dashboard/index.html exists and ships a hashed cia-entry bundle","failureMessages":[],"location":{"line":138,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","CIA dashboard hub bundle (dashboard/index.html)"],"fullName":"Dashboard bundle integrity (post-build) CIA dashboard hub bundle (dashboard/index.html) cia-entry-*.js statically bundles Chart.js (registerables + auto)","status":"skipped","title":"cia-entry-*.js statically bundles Chart.js (registerables + auto)","failureMessages":[],"location":{"line":144,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard bundle integrity (post-build)","CIA dashboard hub bundle (dashboard/index.html)"],"fullName":"Dashboard bundle integrity (post-build) CIA dashboard hub bundle (dashboard/index.html) cia-entry-*.js bundle graph statically references the d3 chunk","status":"skipped","title":"cia-entry-*.js bundle graph statically references the d3 chunk","failureMessages":[],"location":{"line":194,"column":5},"meta":{},"tags":[]}],"startTime":1787953656920,"endTime":1787953656920,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/dashboard-bundle-integrity.test.ts"},{"assertionResults":[{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/stats-loader.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/stats-loader.ts should not contain relative cia-data/ string literals","duration":4.167622999999992,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/party-dashboard.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/party-dashboard.ts should not contain relative cia-data/ string literals","duration":0.7229440000000409,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/election-cycle.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/election-cycle.ts should not contain relative cia-data/ string literals","duration":0.5661499999999933,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/committees-dashboard.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/committees-dashboard.ts should not contain relative cia-data/ string literals","duration":0.492621999999983,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/coalition-dashboard.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/coalition-dashboard.ts should not contain relative cia-data/ string literals","duration":0.6088599999999929,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/seasonal-patterns.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/seasonal-patterns.ts should not contain relative cia-data/ string literals","duration":0.5966669999999681,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/pre-election.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/pre-election.ts should not contain relative cia-data/ string literals","duration":0.5828309999999988,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/anomaly-detection.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/anomaly-detection.ts should not contain relative cia-data/ string literals","duration":0.44594500000005155,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/ministry-dashboard.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/ministry-dashboard.ts should not contain relative cia-data/ string literals","duration":0.7131750000000352,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/risk-dashboard.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/risk-dashboard.ts should not contain relative cia-data/ string literals","duration":0.5447200000000407,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/dashboards/politician-dashboard.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/dashboards/politician-dashboard.ts should not contain relative cia-data/ string literals","duration":0.48422600000003513,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard modules use absolute /cia-data/ URLs"],"fullName":"Dashboard modules use absolute /cia-data/ URLs src/browser/cia/data-loader.ts should not contain relative cia-data/ string literals","status":"passed","title":"src/browser/cia/data-loader.ts should not contain relative cia-data/ string literals","duration":0.3367709999999988,"failureMessages":[],"location":{"line":47,"column":5},"meta":{},"tags":[]}],"startTime":1787953920266,"endTime":1787953920276.3367,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/dashboard-cia-data-absolute-paths.test.ts"},{"assertionResults":[{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","stats-loader"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist stats-loader should have extraction_summary_report.csv","status":"passed","title":"should have extraction_summary_report.csv","duration":5.599212999999963,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist party-dashboard should have party/distribution_party_performance.csv","status":"passed","title":"should have party/distribution_party_performance.csv","duration":0.6956920000000082,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist party-dashboard should have party/distribution_party_effectiveness_trends.csv","status":"passed","title":"should have party/distribution_party_effectiveness_trends.csv","duration":0.5473949999999377,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist party-dashboard should have party/distribution_party_momentum.csv","status":"passed","title":"should have party/distribution_party_momentum.csv","duration":0.5372660000000451,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist party-dashboard should have party/distribution_coalition_alignment.csv","status":"passed","title":"should have party/distribution_coalition_alignment.csv","duration":0.4923720000000458,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist party-dashboard should have party/distribution_annual_party_members.csv","status":"passed","title":"should have party/distribution_annual_party_members.csv","duration":0.630410999999981,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist party-dashboard should have party/distribution_annual_party_votes.csv","status":"passed","title":"should have party/distribution_annual_party_votes.csv","duration":0.47763399999996636,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist election-cycle should have election-cycle/view_election_cycle_comparative_analysis_sample.csv","status":"passed","title":"should have election-cycle/view_election_cycle_comparative_analysis_sample.csv","duration":0.5038030000000617,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist election-cycle should have election-cycle/view_election_cycle_decision_intelligence_sample.csv","status":"passed","title":"should have election-cycle/view_election_cycle_decision_intelligence_sample.csv","duration":0.6714769999999817,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist election-cycle should have election-cycle/view_election_cycle_predictive_intelligence_sample.csv","status":"passed","title":"should have election-cycle/view_election_cycle_predictive_intelligence_sample.csv","duration":0.45960999999999785,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist election-cycle should have election-cycle/view_election_cycle_temporal_trends_sample.csv","status":"passed","title":"should have election-cycle/view_election_cycle_temporal_trends_sample.csv","duration":0.579072999999994,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist committees-dashboard should have distribution_committee_productivity_matrix.csv","status":"passed","title":"should have distribution_committee_productivity_matrix.csv","duration":0.4751499999999851,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist committees-dashboard should have view_riksdagen_committee_decisions.csv","status":"passed","title":"should have view_riksdagen_committee_decisions.csv","duration":0.5318260000000237,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist committees-dashboard should have distribution_annual_committee_documents.csv","status":"passed","title":"should have distribution_annual_committee_documents.csv","duration":0.5498000000000047,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist committees-dashboard should have view_riksdagen_committee_ballot_decision_party_summary.csv","status":"passed","title":"should have view_riksdagen_committee_ballot_decision_party_summary.csv","duration":0.6029690000000301,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist committees-dashboard should have percentile_seasonal_activity_patterns.csv","status":"passed","title":"should have percentile_seasonal_activity_patterns.csv","duration":0.6201710000000276,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist coalition-dashboard should have party/distribution_coalition_alignment.csv","status":"passed","title":"should have party/distribution_coalition_alignment.csv","duration":0.4959689999999455,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist coalition-dashboard should have parties/distribution_behavioral_patterns_by_party.csv","status":"passed","title":"should have parties/distribution_behavioral_patterns_by_party.csv","duration":0.5214160000000447,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist coalition-dashboard should have parties/distribution_decision_patterns_by_party.csv","status":"passed","title":"should have parties/distribution_decision_patterns_by_party.csv","duration":0.5136919999999918,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist coalition-dashboard should have anomaly/distribution_anomaly_by_party.csv","status":"passed","title":"should have anomaly/distribution_anomaly_by_party.csv","duration":0.5611809999999195,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist coalition-dashboard should have voting/distribution_annual_party_votes.csv","status":"passed","title":"should have voting/distribution_annual_party_votes.csv","duration":0.6086090000000013,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist coalition-dashboard should have voting/distribution_decision_trends.csv","status":"passed","title":"should have voting/distribution_decision_trends.csv","duration":0.6502369999999473,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist coalition-dashboard should have distribution_party_momentum.csv","status":"passed","title":"should have distribution_party_momentum.csv","duration":0.7288549999999532,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist seasonal-patterns should have seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv","status":"passed","title":"should have seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv","duration":0.6068559999999934,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","pre-election"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist pre-election should have pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv","status":"passed","title":"should have pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv","duration":0.6383150000000342,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","pre-election"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist pre-election should have pre-election/view_riksdagen_q4_election_year_comparison_sample.csv","status":"passed","title":"should have pre-election/view_riksdagen_q4_election_year_comparison_sample.csv","duration":0.680072999999993,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","anomaly-detection"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist anomaly-detection should have seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv","status":"passed","title":"should have seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv","duration":0.6683819999999514,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist ministry-dashboard should have ministry/distribution_ministry_risk_levels.csv","status":"passed","title":"should have ministry/distribution_ministry_risk_levels.csv","duration":0.7412980000000289,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist ministry-dashboard should have ministry/distribution_ministry_productivity_matrix.csv","status":"passed","title":"should have ministry/distribution_ministry_productivity_matrix.csv","duration":0.6567389999999023,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist ministry-dashboard should have ministry/distribution_ministry_decision_impact.csv","status":"passed","title":"should have ministry/distribution_ministry_decision_impact.csv","duration":0.7150990000000093,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist ministry-dashboard should have ministry/distribution_ministry_effectiveness.csv","status":"passed","title":"should have ministry/distribution_ministry_effectiveness.csv","duration":1.0243679999999813,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist ministry-dashboard should have ministry/distribution_ministry_risk_quarterly.csv","status":"passed","title":"should have ministry/distribution_ministry_risk_quarterly.csv","duration":1.049955999999952,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","risk-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist risk-dashboard should have politician/view_politician_risk_summary_sample.csv","status":"passed","title":"should have politician/view_politician_risk_summary_sample.csv","duration":0.7811030000000301,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist politician-dashboard should have politician/view_politician_risk_summary_sample.csv","status":"passed","title":"should have politician/view_politician_risk_summary_sample.csv","duration":0.8979810000000725,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist politician-dashboard should have politician/view_riksdagen_politician_influence_metrics_sample.csv","status":"passed","title":"should have politician/view_riksdagen_politician_influence_metrics_sample.csv","duration":0.9584439999999859,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist politician-dashboard should have politician/view_politician_behavioral_trends_sample.csv","status":"passed","title":"should have politician/view_politician_behavioral_trends_sample.csv","duration":0.8222799999999779,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist politician-dashboard should have politician/distribution_experience_levels.csv","status":"passed","title":"should have politician/distribution_experience_levels.csv","duration":0.7723059999999577,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist politician-dashboard should have politician/distribution_influence_buckets.csv","status":"passed","title":"should have politician/distribution_influence_buckets.csv","duration":0.8230109999999513,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist politician-dashboard should have politician/distribution_assignment_roles.csv","status":"passed","title":"should have politician/distribution_assignment_roles.csv","duration":0.8747270000000071,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have distribution_person_status.csv","status":"passed","title":"should have distribution_person_status.csv","duration":0.9377259999999978,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have distribution_risk_by_party.csv","status":"passed","title":"should have distribution_risk_by_party.csv","duration":1.0357989999999972,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have distribution_politician_risk_levels.csv","status":"passed","title":"should have distribution_politician_risk_levels.csv","duration":1.0904620000000023,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have voting/distribution_annual_ballots.csv","status":"passed","title":"should have voting/distribution_annual_ballots.csv","duration":0.9551079999999956,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have risk/distribution_crisis_resilience.csv","status":"passed","title":"should have risk/distribution_crisis_resilience.csv","duration":0.9137200000000121,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_party_performance.csv","status":"passed","title":"should have party/distribution_party_performance.csv","duration":0.9813669999999775,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/view_party_performance_metrics_sample.csv","status":"passed","title":"should have party/view_party_performance_metrics_sample.csv","duration":0.9355219999999917,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_party_momentum.csv","status":"passed","title":"should have party/distribution_party_momentum.csv","duration":1.0406279999999697,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_annual_party_members.csv","status":"passed","title":"should have party/distribution_annual_party_members.csv","duration":0.9494979999999487,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have politician/view_riksdagen_politician_influence_metrics_sample.csv","status":"passed","title":"should have politician/view_riksdagen_politician_influence_metrics_sample.csv","duration":1.0923050000000103,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have politician/view_politician_risk_summary_sample.csv","status":"passed","title":"should have politician/view_politician_risk_summary_sample.csv","duration":1.0139580000000024,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have committee/distribution_committee_productivity.csv","status":"passed","title":"should have committee/distribution_committee_productivity.csv","duration":1.060895999999957,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have committee/distribution_committee_activity.csv","status":"passed","title":"should have committee/distribution_committee_activity.csv","duration":1.0131069999999909,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_party_effectiveness_trends.csv","status":"passed","title":"should have party/distribution_party_effectiveness_trends.csv","duration":1.052930999999944,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have election/election_forecast.csv","status":"passed","title":"should have election/election_forecast.csv","duration":10.53108599999996,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have election/coalition_scenarios.csv","status":"passed","title":"should have election/coalition_scenarios.csv","duration":1.6754869999999755,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_coalition_alignment.csv","status":"passed","title":"should have party/distribution_coalition_alignment.csv","duration":0.869638000000009,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_gender_by_party.csv","status":"passed","title":"should have party/distribution_gender_by_party.csv","duration":0.6466709999999694,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_experience_by_party.csv","status":"passed","title":"should have party/distribution_experience_by_party.csv","duration":0.7506050000000641,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have ministry/distribution_ministry_effectiveness.csv","status":"passed","title":"should have ministry/distribution_ministry_effectiveness.csv","duration":0.7803409999999076,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have voting/distribution_annual_document_types.csv","status":"passed","title":"should have voting/distribution_annual_document_types.csv","duration":0.7458370000000514,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have voting/distribution_decision_trends.csv","status":"passed","title":"should have voting/distribution_decision_trends.csv","duration":0.6907429999999977,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have election/distribution_election_regions.csv","status":"passed","title":"should have election/distribution_election_regions.csv","duration":0.8227299999999786,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have view_riksdagen_goverment_role_member_sample.csv","status":"passed","title":"should have view_riksdagen_goverment_role_member_sample.csv","duration":0.7394350000000713,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have distribution_risk_evolution_temporal.csv","status":"passed","title":"should have distribution_risk_evolution_temporal.csv","duration":0.958295000000021,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files exist","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files exist cia-dashboard should have party/distribution_behavioral_patterns_by_party.csv","status":"passed","title":"should have party/distribution_behavioral_patterns_by_party.csv","duration":0.8838749999999891,"failureMessages":[],"location":{"line":191,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","stats-loader"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) stats-loader extraction_summary_report.csv should have at least 1 data row","status":"passed","title":"extraction_summary_report.csv should have at least 1 data row","duration":1.1547109999999066,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) party-dashboard party/distribution_party_performance.csv should have at least 1 data row","status":"passed","title":"party/distribution_party_performance.csv should have at least 1 data row","duration":0.8419360000000324,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) party-dashboard party/distribution_party_effectiveness_trends.csv should have at least 1 data row","status":"passed","title":"party/distribution_party_effectiveness_trends.csv should have at least 1 data row","duration":0.8966589999999997,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) party-dashboard party/distribution_party_momentum.csv should have at least 1 data row","status":"passed","title":"party/distribution_party_momentum.csv should have at least 1 data row","duration":1.1760810000000674,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) party-dashboard party/distribution_coalition_alignment.csv should have at least 1 data row","status":"passed","title":"party/distribution_coalition_alignment.csv should have at least 1 data row","duration":0.914421999999945,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) party-dashboard party/distribution_annual_party_members.csv should have at least 1 data row","status":"passed","title":"party/distribution_annual_party_members.csv should have at least 1 data row","duration":0.912488000000053,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) party-dashboard party/distribution_annual_party_votes.csv should have at least 1 data row","status":"passed","title":"party/distribution_annual_party_votes.csv should have at least 1 data row","duration":0.9587849999999207,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) election-cycle election-cycle/view_election_cycle_comparative_analysis_sample.csv should have at least 1 data row","status":"passed","title":"election-cycle/view_election_cycle_comparative_analysis_sample.csv should have at least 1 data row","duration":0.9780809999999747,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) election-cycle election-cycle/view_election_cycle_decision_intelligence_sample.csv should have at least 1 data row","status":"passed","title":"election-cycle/view_election_cycle_decision_intelligence_sample.csv should have at least 1 data row","duration":0.992678000000069,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) election-cycle election-cycle/view_election_cycle_predictive_intelligence_sample.csv should have at least 1 data row","status":"passed","title":"election-cycle/view_election_cycle_predictive_intelligence_sample.csv should have at least 1 data row","duration":0.9686440000000403,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","election-cycle"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) election-cycle election-cycle/view_election_cycle_temporal_trends_sample.csv should have at least 1 data row","status":"passed","title":"election-cycle/view_election_cycle_temporal_trends_sample.csv should have at least 1 data row","duration":0.9995710000000599,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) committees-dashboard distribution_committee_productivity_matrix.csv should have at least 1 data row","status":"passed","title":"distribution_committee_productivity_matrix.csv should have at least 1 data row","duration":1.0329739999999674,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) committees-dashboard view_riksdagen_committee_decisions.csv should have at least 1 data row","status":"passed","title":"view_riksdagen_committee_decisions.csv should have at least 1 data row","duration":37.17560900000001,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) committees-dashboard distribution_annual_committee_documents.csv should have at least 1 data row","status":"passed","title":"distribution_annual_committee_documents.csv should have at least 1 data row","duration":1.9775220000000218,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) committees-dashboard view_riksdagen_committee_ballot_decision_party_summary.csv should have at least 1 data row","status":"passed","title":"view_riksdagen_committee_ballot_decision_party_summary.csv should have at least 1 data row","duration":41.16138000000001,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) committees-dashboard percentile_seasonal_activity_patterns.csv should have at least 1 data row","status":"passed","title":"percentile_seasonal_activity_patterns.csv should have at least 1 data row","duration":1.7485940000000255,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) coalition-dashboard party/distribution_coalition_alignment.csv should have at least 1 data row","status":"passed","title":"party/distribution_coalition_alignment.csv should have at least 1 data row","duration":1.2380970000000389,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) coalition-dashboard parties/distribution_behavioral_patterns_by_party.csv should have at least 1 data row","status":"passed","title":"parties/distribution_behavioral_patterns_by_party.csv should have at least 1 data row","duration":1.7507880000000569,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) coalition-dashboard parties/distribution_decision_patterns_by_party.csv should have at least 1 data row","status":"passed","title":"parties/distribution_decision_patterns_by_party.csv should have at least 1 data row","duration":1.5090250000000651,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) coalition-dashboard anomaly/distribution_anomaly_by_party.csv should have at least 1 data row","status":"passed","title":"anomaly/distribution_anomaly_by_party.csv should have at least 1 data row","duration":1.2337390000000141,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) coalition-dashboard voting/distribution_annual_party_votes.csv should have at least 1 data row","status":"passed","title":"voting/distribution_annual_party_votes.csv should have at least 1 data row","duration":1.2382989999999836,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) coalition-dashboard voting/distribution_decision_trends.csv should have at least 1 data row","status":"passed","title":"voting/distribution_decision_trends.csv should have at least 1 data row","duration":1.2425369999999702,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) coalition-dashboard distribution_party_momentum.csv should have at least 1 data row","status":"passed","title":"distribution_party_momentum.csv should have at least 1 data row","duration":1.2430970000000343,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) seasonal-patterns seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv should have at least 1 data row","status":"passed","title":"seasonal/view_riksdagen_seasonal_activity_patterns_sample.csv should have at least 1 data row","duration":1.2833119999999099,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","pre-election"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) pre-election pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv should have at least 1 data row","status":"passed","title":"pre-election/view_riksdagen_pre_election_quarterly_activity_sample.csv should have at least 1 data row","duration":1.3224860000000263,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","pre-election"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) pre-election pre-election/view_riksdagen_q4_election_year_comparison_sample.csv should have at least 1 data row","status":"passed","title":"pre-election/view_riksdagen_q4_election_year_comparison_sample.csv should have at least 1 data row","duration":1.268624999999929,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","anomaly-detection"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) anomaly-detection seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv should have at least 1 data row","status":"passed","title":"seasonal/view_riksdagen_seasonal_anomaly_detection_sample.csv should have at least 1 data row","duration":1.3180869999999913,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) ministry-dashboard ministry/distribution_ministry_risk_levels.csv should have at least 1 data row","status":"passed","title":"ministry/distribution_ministry_risk_levels.csv should have at least 1 data row","duration":1.3708870000000388,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) ministry-dashboard ministry/distribution_ministry_productivity_matrix.csv should have at least 1 data row","status":"passed","title":"ministry/distribution_ministry_productivity_matrix.csv should have at least 1 data row","duration":1.4474700000000666,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) ministry-dashboard ministry/distribution_ministry_decision_impact.csv should have at least 1 data row","status":"passed","title":"ministry/distribution_ministry_decision_impact.csv should have at least 1 data row","duration":1.3610479999999825,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) ministry-dashboard ministry/distribution_ministry_effectiveness.csv should have at least 1 data row","status":"passed","title":"ministry/distribution_ministry_effectiveness.csv should have at least 1 data row","duration":1.3402399999999943,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) ministry-dashboard ministry/distribution_ministry_risk_quarterly.csv should have at least 1 data row","status":"passed","title":"ministry/distribution_ministry_risk_quarterly.csv should have at least 1 data row","duration":1.4210610000000088,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","risk-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) risk-dashboard politician/view_politician_risk_summary_sample.csv should have at least 1 data row","status":"passed","title":"politician/view_politician_risk_summary_sample.csv should have at least 1 data row","duration":1.5765010000000075,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) politician-dashboard politician/view_politician_risk_summary_sample.csv should have at least 1 data row","status":"passed","title":"politician/view_politician_risk_summary_sample.csv should have at least 1 data row","duration":1.5276799999999184,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) politician-dashboard politician/view_riksdagen_politician_influence_metrics_sample.csv should have at least 1 data row","status":"passed","title":"politician/view_riksdagen_politician_influence_metrics_sample.csv should have at least 1 data row","duration":1.4836480000000165,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) politician-dashboard politician/view_politician_behavioral_trends_sample.csv should have at least 1 data row","status":"passed","title":"politician/view_politician_behavioral_trends_sample.csv should have at least 1 data row","duration":1.5893049999999675,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) politician-dashboard politician/distribution_experience_levels.csv should have at least 1 data row","status":"passed","title":"politician/distribution_experience_levels.csv should have at least 1 data row","duration":1.6629330000000664,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) politician-dashboard politician/distribution_influence_buckets.csv should have at least 1 data row","status":"passed","title":"politician/distribution_influence_buckets.csv should have at least 1 data row","duration":1.625583000000006,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) politician-dashboard politician/distribution_assignment_roles.csv should have at least 1 data row","status":"passed","title":"politician/distribution_assignment_roles.csv should have at least 1 data row","duration":1.8617859999999382,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard distribution_person_status.csv should have at least 1 data row","status":"passed","title":"distribution_person_status.csv should have at least 1 data row","duration":1.5738470000000007,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard distribution_risk_by_party.csv should have at least 1 data row","status":"passed","title":"distribution_risk_by_party.csv should have at least 1 data row","duration":1.5334020000000237,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard distribution_politician_risk_levels.csv should have at least 1 data row","status":"passed","title":"distribution_politician_risk_levels.csv should have at least 1 data row","duration":1.5451219999999921,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard voting/distribution_annual_ballots.csv should have at least 1 data row","status":"passed","title":"voting/distribution_annual_ballots.csv should have at least 1 data row","duration":1.5782749999999623,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard risk/distribution_crisis_resilience.csv should have at least 1 data row","status":"passed","title":"risk/distribution_crisis_resilience.csv should have at least 1 data row","duration":1.5978020000000015,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_party_performance.csv should have at least 1 data row","status":"passed","title":"party/distribution_party_performance.csv should have at least 1 data row","duration":1.649989000000005,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/view_party_performance_metrics_sample.csv should have at least 1 data row","status":"passed","title":"party/view_party_performance_metrics_sample.csv should have at least 1 data row","duration":1.6236289999999372,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_party_momentum.csv should have at least 1 data row","status":"passed","title":"party/distribution_party_momentum.csv should have at least 1 data row","duration":1.6651669999999967,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_annual_party_members.csv should have at least 1 data row","status":"passed","title":"party/distribution_annual_party_members.csv should have at least 1 data row","duration":1.7462889999999334,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard politician/view_riksdagen_politician_influence_metrics_sample.csv should have at least 1 data row","status":"passed","title":"politician/view_riksdagen_politician_influence_metrics_sample.csv should have at least 1 data row","duration":1.7240980000000263,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard politician/view_politician_risk_summary_sample.csv should have at least 1 data row","status":"passed","title":"politician/view_politician_risk_summary_sample.csv should have at least 1 data row","duration":1.7549850000000333,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard committee/distribution_committee_productivity.csv should have at least 1 data row","status":"passed","title":"committee/distribution_committee_productivity.csv should have at least 1 data row","duration":1.754905000000008,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard committee/distribution_committee_activity.csv should have at least 1 data row","status":"passed","title":"committee/distribution_committee_activity.csv should have at least 1 data row","duration":2.016905999999949,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_party_effectiveness_trends.csv should have at least 1 data row","status":"passed","title":"party/distribution_party_effectiveness_trends.csv should have at least 1 data row","duration":2.2165699999999333,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard election/election_forecast.csv should have at least 1 data row","status":"passed","title":"election/election_forecast.csv should have at least 1 data row","duration":3.034730999999965,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard election/coalition_scenarios.csv should have at least 1 data row","status":"passed","title":"election/coalition_scenarios.csv should have at least 1 data row","duration":2.931838999999968,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_coalition_alignment.csv should have at least 1 data row","status":"passed","title":"party/distribution_coalition_alignment.csv should have at least 1 data row","duration":2.992082000000096,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_gender_by_party.csv should have at least 1 data row","status":"passed","title":"party/distribution_gender_by_party.csv should have at least 1 data row","duration":3.0278279999999995,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_experience_by_party.csv should have at least 1 data row","status":"passed","title":"party/distribution_experience_by_party.csv should have at least 1 data row","duration":3.0259750000000167,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard ministry/distribution_ministry_effectiveness.csv should have at least 1 data row","status":"passed","title":"ministry/distribution_ministry_effectiveness.csv should have at least 1 data row","duration":2.579168999999979,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard voting/distribution_annual_document_types.csv should have at least 1 data row","status":"passed","title":"voting/distribution_annual_document_types.csv should have at least 1 data row","duration":1.951133000000027,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard voting/distribution_decision_trends.csv should have at least 1 data row","status":"passed","title":"voting/distribution_decision_trends.csv should have at least 1 data row","duration":1.9735449999999446,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard election/distribution_election_regions.csv should have at least 1 data row","status":"passed","title":"election/distribution_election_regions.csv should have at least 1 data row","duration":2.231518000000051,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard view_riksdagen_goverment_role_member_sample.csv should have at least 1 data row","status":"passed","title":"view_riksdagen_goverment_role_member_sample.csv should have at least 1 data row","duration":2.0242600000000266,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard distribution_risk_evolution_temporal.csv should have at least 1 data row","status":"passed","title":"distribution_risk_evolution_temporal.csv should have at least 1 data row","duration":1.9768109999999979,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","All dashboard CSV files have data rows (not just headers)","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity All dashboard CSV files have data rows (not just headers) cia-dashboard party/distribution_behavioral_patterns_by_party.csv should have at least 1 data row","status":"passed","title":"party/distribution_behavioral_patterns_by_party.csv should have at least 1 data row","duration":1.953467000000046,"failureMessages":[],"location":{"line":204,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist stats-loader module should exist at src/browser/dashboards/stats-loader.ts","status":"passed","title":"stats-loader module should exist at src/browser/dashboards/stats-loader.ts","duration":2.0947720000000345,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist party-dashboard module should exist at src/browser/dashboards/party-dashboard.ts","status":"passed","title":"party-dashboard module should exist at src/browser/dashboards/party-dashboard.ts","duration":2.8252599999999575,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist election-cycle module should exist at src/browser/dashboards/election-cycle.ts","status":"passed","title":"election-cycle module should exist at src/browser/dashboards/election-cycle.ts","duration":1.9618030000000317,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist committees-dashboard module should exist at src/browser/dashboards/committees-dashboard.ts","status":"passed","title":"committees-dashboard module should exist at src/browser/dashboards/committees-dashboard.ts","duration":2.045178999999962,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist coalition-dashboard module should exist at src/browser/dashboards/coalition-dashboard.ts","status":"passed","title":"coalition-dashboard module should exist at src/browser/dashboards/coalition-dashboard.ts","duration":1.9862880000000587,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist seasonal-patterns module should exist at src/browser/dashboards/seasonal-patterns.ts","status":"passed","title":"seasonal-patterns module should exist at src/browser/dashboards/seasonal-patterns.ts","duration":2.10187499999995,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist pre-election module should exist at src/browser/dashboards/pre-election.ts","status":"passed","title":"pre-election module should exist at src/browser/dashboards/pre-election.ts","duration":2.786016000000018,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist anomaly-detection module should exist at src/browser/dashboards/anomaly-detection.ts","status":"passed","title":"anomaly-detection module should exist at src/browser/dashboards/anomaly-detection.ts","duration":2.321446000000037,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist ministry-dashboard module should exist at src/browser/dashboards/ministry-dashboard.ts","status":"passed","title":"ministry-dashboard module should exist at src/browser/dashboards/ministry-dashboard.ts","duration":2.0904339999999593,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist risk-dashboard module should exist at src/browser/dashboards/risk-dashboard.ts","status":"passed","title":"risk-dashboard module should exist at src/browser/dashboards/risk-dashboard.ts","duration":2.0866060000000743,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist politician-dashboard module should exist at src/browser/dashboards/politician-dashboard.ts","status":"passed","title":"politician-dashboard module should exist at src/browser/dashboards/politician-dashboard.ts","duration":2.144935999999916,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard module files exist"],"fullName":"Dashboard-CSV Data Integrity Dashboard module files exist cia-dashboard module should exist at src/browser/cia/data-loader.ts","status":"passed","title":"cia-dashboard module should exist at src/browser/cia/data-loader.ts","duration":2.0981879999999364,"failureMessages":[],"location":{"line":218,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/parties.html should have container #party-dashboard","status":"passed","title":"dashboards/parties.html should have container #party-dashboard","duration":2.4655050000000074,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/election-cycle.html should have container #election-cycle-dashboard","status":"passed","title":"dashboards/election-cycle.html should have container #election-cycle-dashboard","duration":2.206099999999992,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/committees.html should have container #committee-dashboard","status":"passed","title":"dashboards/committees.html should have container #committee-dashboard","duration":2.232138999999961,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/coalitions.html should have container #coalition-dashboard","status":"passed","title":"dashboards/coalitions.html should have container #coalition-dashboard","duration":2.224815000000035,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/seasonal-patterns.html should have container #seasonal-patterns-dashboard","status":"passed","title":"dashboards/seasonal-patterns.html should have container #seasonal-patterns-dashboard","duration":2.2563149999999723,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/pre-election.html should have container #pre-election-dashboard","status":"passed","title":"dashboards/pre-election.html should have container #pre-election-dashboard","duration":2.268387000000075,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/anomaly-detection.html should have container #anomaly-detection-dashboard","status":"passed","title":"dashboards/anomaly-detection.html should have container #anomaly-detection-dashboard","duration":2.3275580000000673,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/ministers.html should have container #ministry-dashboard","status":"passed","title":"dashboards/ministers.html should have container #ministry-dashboard","duration":2.3131309999999985,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) dashboards/risk.html should have container #risk-dashboard","status":"passed","title":"dashboards/risk.html should have container #risk-dashboard","duration":2.3287599999999884,"failureMessages":[],"location":{"line":242,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","No orphaned dashboard HTML containers (specialised dashboard pages)"],"fullName":"Dashboard-CSV Data Integrity No orphaned dashboard HTML containers (specialised dashboard pages) index.html should expose a hub linking to every specialised dashboard","status":"passed","title":"index.html should expose a hub linking to every specialised dashboard","duration":2.8866140000000087,"failureMessages":[],"location":{"line":248,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties.html","status":"passed","title":"should have dashboards/parties.html","duration":2.542780999999991,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_ar.html","status":"passed","title":"should have dashboards/parties_ar.html","duration":2.3798550000000205,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_da.html","status":"passed","title":"should have dashboards/parties_da.html","duration":2.6971999999999525,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_de.html","status":"passed","title":"should have dashboards/parties_de.html","duration":2.8006829999999354,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_es.html","status":"passed","title":"should have dashboards/parties_es.html","duration":2.7939409999999043,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_fi.html","status":"passed","title":"should have dashboards/parties_fi.html","duration":2.757863999999927,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_fr.html","status":"passed","title":"should have dashboards/parties_fr.html","duration":3.218766999999957,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_he.html","status":"passed","title":"should have dashboards/parties_he.html","duration":3.6370090000000346,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_ja.html","status":"passed","title":"should have dashboards/parties_ja.html","duration":2.895972000000029,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_ko.html","status":"passed","title":"should have dashboards/parties_ko.html","duration":2.81570099999999,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_nl.html","status":"passed","title":"should have dashboards/parties_nl.html","duration":2.8666170000000193,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_no.html","status":"passed","title":"should have dashboards/parties_no.html","duration":3.3694080000000213,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_sv.html","status":"passed","title":"should have dashboards/parties_sv.html","duration":2.9132339999999886,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/parties_zh.html","status":"passed","title":"should have dashboards/parties_zh.html","duration":2.981612000000041,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle.html","status":"passed","title":"should have dashboards/election-cycle.html","duration":2.921880999999985,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_ar.html","status":"passed","title":"should have dashboards/election-cycle_ar.html","duration":2.9582580000000007,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_da.html","status":"passed","title":"should have dashboards/election-cycle_da.html","duration":2.986340999999925,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_de.html","status":"passed","title":"should have dashboards/election-cycle_de.html","duration":3.0245929999999817,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_es.html","status":"passed","title":"should have dashboards/election-cycle_es.html","duration":3.0031529999999975,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_fi.html","status":"passed","title":"should have dashboards/election-cycle_fi.html","duration":3.113609999999994,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_fr.html","status":"passed","title":"should have dashboards/election-cycle_fr.html","duration":3.1253510000000233,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_he.html","status":"passed","title":"should have dashboards/election-cycle_he.html","duration":3.0500599999999167,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_ja.html","status":"passed","title":"should have dashboards/election-cycle_ja.html","duration":3.1601669999998876,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_ko.html","status":"passed","title":"should have dashboards/election-cycle_ko.html","duration":3.185504000000037,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_nl.html","status":"passed","title":"should have dashboards/election-cycle_nl.html","duration":3.2113319999998566,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_no.html","status":"passed","title":"should have dashboards/election-cycle_no.html","duration":3.188218000000006,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_sv.html","status":"passed","title":"should have dashboards/election-cycle_sv.html","duration":3.233793999999989,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/election-cycle_zh.html","status":"passed","title":"should have dashboards/election-cycle_zh.html","duration":3.245335999999952,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees.html","status":"passed","title":"should have dashboards/committees.html","duration":3.192145999999866,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_ar.html","status":"passed","title":"should have dashboards/committees_ar.html","duration":4.407651999999871,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_da.html","status":"passed","title":"should have dashboards/committees_da.html","duration":3.7056569999999738,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_de.html","status":"passed","title":"should have dashboards/committees_de.html","duration":3.5906320000001415,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_es.html","status":"passed","title":"should have dashboards/committees_es.html","duration":3.356924999999819,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_fi.html","status":"passed","title":"should have dashboards/committees_fi.html","duration":3.4020889999999326,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_fr.html","status":"passed","title":"should have dashboards/committees_fr.html","duration":4.975676000000021,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_he.html","status":"passed","title":"should have dashboards/committees_he.html","duration":3.1892599999998765,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_ja.html","status":"passed","title":"should have dashboards/committees_ja.html","duration":3.1212530000000243,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_ko.html","status":"passed","title":"should have dashboards/committees_ko.html","duration":4.060301999999865,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_nl.html","status":"passed","title":"should have dashboards/committees_nl.html","duration":3.3645289999999477,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_no.html","status":"passed","title":"should have dashboards/committees_no.html","duration":3.126022000000148,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_sv.html","status":"passed","title":"should have dashboards/committees_sv.html","duration":3.0949439999999413,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/committees_zh.html","status":"passed","title":"should have dashboards/committees_zh.html","duration":3.1771179999998367,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions.html","status":"passed","title":"should have dashboards/coalitions.html","duration":3.147502999999915,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_ar.html","status":"passed","title":"should have dashboards/coalitions_ar.html","duration":3.188840999999911,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_da.html","status":"passed","title":"should have dashboards/coalitions_da.html","duration":3.2002919999999904,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_de.html","status":"passed","title":"should have dashboards/coalitions_de.html","duration":3.419502000000193,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_es.html","status":"passed","title":"should have dashboards/coalitions_es.html","duration":3.2685599999999795,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_fi.html","status":"passed","title":"should have dashboards/coalitions_fi.html","duration":3.4704269999999724,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_fr.html","status":"passed","title":"should have dashboards/coalitions_fr.html","duration":3.3555730000000494,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_he.html","status":"passed","title":"should have dashboards/coalitions_he.html","duration":3.3230610000000524,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_ja.html","status":"passed","title":"should have dashboards/coalitions_ja.html","duration":3.262678000000051,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_ko.html","status":"passed","title":"should have dashboards/coalitions_ko.html","duration":3.264652000000069,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_nl.html","status":"passed","title":"should have dashboards/coalitions_nl.html","duration":3.2768650000000434,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_no.html","status":"passed","title":"should have dashboards/coalitions_no.html","duration":3.7022309999999834,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_sv.html","status":"passed","title":"should have dashboards/coalitions_sv.html","duration":3.3327690000000985,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/coalitions_zh.html","status":"passed","title":"should have dashboards/coalitions_zh.html","duration":3.3813199999999597,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns.html","status":"passed","title":"should have dashboards/seasonal-patterns.html","duration":3.4339380000001256,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_ar.html","status":"passed","title":"should have dashboards/seasonal-patterns_ar.html","duration":3.3861490000001595,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_da.html","status":"passed","title":"should have dashboards/seasonal-patterns_da.html","duration":3.4364129999999022,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_de.html","status":"passed","title":"should have dashboards/seasonal-patterns_de.html","duration":3.4388080000001082,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_es.html","status":"passed","title":"should have dashboards/seasonal-patterns_es.html","duration":3.464465999999902,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_fi.html","status":"passed","title":"should have dashboards/seasonal-patterns_fi.html","duration":3.6116309999999885,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_fr.html","status":"passed","title":"should have dashboards/seasonal-patterns_fr.html","duration":3.8404900000000453,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_he.html","status":"passed","title":"should have dashboards/seasonal-patterns_he.html","duration":3.6819440000001578,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_ja.html","status":"passed","title":"should have dashboards/seasonal-patterns_ja.html","duration":3.6913899999999558,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_ko.html","status":"passed","title":"should have dashboards/seasonal-patterns_ko.html","duration":3.8546269999999367,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_nl.html","status":"passed","title":"should have dashboards/seasonal-patterns_nl.html","duration":3.958421000000044,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_no.html","status":"passed","title":"should have dashboards/seasonal-patterns_no.html","duration":6.928883000000042,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_sv.html","status":"passed","title":"should have dashboards/seasonal-patterns_sv.html","duration":5.642364000000043,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/seasonal-patterns_zh.html","status":"passed","title":"should have dashboards/seasonal-patterns_zh.html","duration":3.811805999999933,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election.html","status":"passed","title":"should have dashboards/pre-election.html","duration":3.7086629999998877,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_ar.html","status":"passed","title":"should have dashboards/pre-election_ar.html","duration":3.9932960000001003,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_da.html","status":"passed","title":"should have dashboards/pre-election_da.html","duration":3.7344009999999344,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_de.html","status":"passed","title":"should have dashboards/pre-election_de.html","duration":3.736855999999989,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_es.html","status":"passed","title":"should have dashboards/pre-election_es.html","duration":3.713412000000062,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_fi.html","status":"passed","title":"should have dashboards/pre-election_fi.html","duration":3.7209069999998974,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_fr.html","status":"passed","title":"should have dashboards/pre-election_fr.html","duration":3.7625040000000354,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_he.html","status":"passed","title":"should have dashboards/pre-election_he.html","duration":3.843847000000096,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_ja.html","status":"passed","title":"should have dashboards/pre-election_ja.html","duration":3.938323000000082,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_ko.html","status":"passed","title":"should have dashboards/pre-election_ko.html","duration":4.94437599999992,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_nl.html","status":"passed","title":"should have dashboards/pre-election_nl.html","duration":3.9819350000000213,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_no.html","status":"passed","title":"should have dashboards/pre-election_no.html","duration":3.8789520000000266,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_sv.html","status":"passed","title":"should have dashboards/pre-election_sv.html","duration":3.8948120000000017,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/pre-election_zh.html","status":"passed","title":"should have dashboards/pre-election_zh.html","duration":3.8387259999999515,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection.html","status":"passed","title":"should have dashboards/anomaly-detection.html","duration":3.8756459999999606,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_ar.html","status":"passed","title":"should have dashboards/anomaly-detection_ar.html","duration":3.9745909999999185,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_da.html","status":"passed","title":"should have dashboards/anomaly-detection_da.html","duration":3.9285440000001017,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_de.html","status":"passed","title":"should have dashboards/anomaly-detection_de.html","duration":3.999427000000196,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_es.html","status":"passed","title":"should have dashboards/anomaly-detection_es.html","duration":3.9365190000000894,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_fi.html","status":"passed","title":"should have dashboards/anomaly-detection_fi.html","duration":3.991703000000143,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_fr.html","status":"passed","title":"should have dashboards/anomaly-detection_fr.html","duration":4.039143000000195,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_he.html","status":"passed","title":"should have dashboards/anomaly-detection_he.html","duration":4.695570999999973,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_ja.html","status":"passed","title":"should have dashboards/anomaly-detection_ja.html","duration":7.2826440000001185,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_ko.html","status":"passed","title":"should have dashboards/anomaly-detection_ko.html","duration":5.03227099999981,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_nl.html","status":"passed","title":"should have dashboards/anomaly-detection_nl.html","duration":4.163994999999886,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_no.html","status":"passed","title":"should have dashboards/anomaly-detection_no.html","duration":4.195795000000089,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_sv.html","status":"passed","title":"should have dashboards/anomaly-detection_sv.html","duration":4.129411000000118,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/anomaly-detection_zh.html","status":"passed","title":"should have dashboards/anomaly-detection_zh.html","duration":4.183881999999812,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers.html","status":"passed","title":"should have dashboards/ministers.html","duration":4.204661999999871,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_ar.html","status":"passed","title":"should have dashboards/ministers_ar.html","duration":4.292445999999927,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_da.html","status":"passed","title":"should have dashboards/ministers_da.html","duration":4.641950000000179,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_de.html","status":"passed","title":"should have dashboards/ministers_de.html","duration":4.3154490000001715,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_es.html","status":"passed","title":"should have dashboards/ministers_es.html","duration":4.337660999999798,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_fi.html","status":"passed","title":"should have dashboards/ministers_fi.html","duration":4.249745999999959,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_fr.html","status":"passed","title":"should have dashboards/ministers_fr.html","duration":4.406048999999939,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_he.html","status":"passed","title":"should have dashboards/ministers_he.html","duration":4.357868000000053,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_ja.html","status":"passed","title":"should have dashboards/ministers_ja.html","duration":4.312364000000116,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_ko.html","status":"passed","title":"should have dashboards/ministers_ko.html","duration":4.332540999999992,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_nl.html","status":"passed","title":"should have dashboards/ministers_nl.html","duration":4.356326000000081,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_no.html","status":"passed","title":"should have dashboards/ministers_no.html","duration":5.867966000000024,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_sv.html","status":"passed","title":"should have dashboards/ministers_sv.html","duration":4.362437,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/ministers_zh.html","status":"passed","title":"should have dashboards/ministers_zh.html","duration":4.349993999999924,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk.html","status":"passed","title":"should have dashboards/risk.html","duration":4.367095999999947,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_ar.html","status":"passed","title":"should have dashboards/risk_ar.html","duration":5.496751000000131,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_da.html","status":"passed","title":"should have dashboards/risk_da.html","duration":7.40843000000018,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_de.html","status":"passed","title":"should have dashboards/risk_de.html","duration":4.321300000000065,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_es.html","status":"passed","title":"should have dashboards/risk_es.html","duration":4.387152999999898,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_fi.html","status":"passed","title":"should have dashboards/risk_fi.html","duration":4.537374999999884,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_fr.html","status":"passed","title":"should have dashboards/risk_fr.html","duration":5.620722999999998,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_he.html","status":"passed","title":"should have dashboards/risk_he.html","duration":4.461121999999932,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_ja.html","status":"passed","title":"should have dashboards/risk_ja.html","duration":4.569584999999961,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_ko.html","status":"passed","title":"should have dashboards/risk_ko.html","duration":4.605983000000151,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_nl.html","status":"passed","title":"should have dashboards/risk_nl.html","duration":4.6277339999999185,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_no.html","status":"passed","title":"should have dashboards/risk_no.html","duration":4.680482999999867,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_sv.html","status":"passed","title":"should have dashboards/risk_sv.html","duration":4.704177000000072,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Specialised dashboard pages exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Specialised dashboard pages exist for all 14 languages should have dashboards/risk_zh.html","status":"passed","title":"should have dashboards/risk_zh.html","duration":4.841773999999987,"failureMessages":[],"location":{"line":269,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index.html","status":"passed","title":"should have dashboard/index.html","duration":5.2398809999999685,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_ar.html","status":"passed","title":"should have dashboard/index_ar.html","duration":4.876369000000068,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_da.html","status":"passed","title":"should have dashboard/index_da.html","duration":4.757697000000007,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_de.html","status":"passed","title":"should have dashboard/index_de.html","duration":4.752216999999973,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_es.html","status":"passed","title":"should have dashboard/index_es.html","duration":4.8059079999998175,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_fi.html","status":"passed","title":"should have dashboard/index_fi.html","duration":5.067397000000028,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_fr.html","status":"passed","title":"should have dashboard/index_fr.html","duration":4.869497000000138,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_he.html","status":"passed","title":"should have dashboard/index_he.html","duration":4.786761999999953,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_ja.html","status":"passed","title":"should have dashboard/index_ja.html","duration":6.147860000000037,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_ko.html","status":"passed","title":"should have dashboard/index_ko.html","duration":7.8623099999999795,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_nl.html","status":"passed","title":"should have dashboard/index_nl.html","duration":7.992463000000043,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_no.html","status":"passed","title":"should have dashboard/index_no.html","duration":6.113565999999992,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_sv.html","status":"passed","title":"should have dashboard/index_sv.html","duration":4.783124999999927,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CIA dashboard HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity CIA dashboard HTML files exist for all 14 languages should have dashboard/index_zh.html","status":"passed","title":"should have dashboard/index_zh.html","duration":4.85718299999985,"failureMessages":[],"location":{"line":280,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index.html","status":"passed","title":"should have index.html","duration":4.951189999999997,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_ar.html","status":"passed","title":"should have index_ar.html","duration":4.872270999999955,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_da.html","status":"passed","title":"should have index_da.html","duration":4.890415999999959,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_de.html","status":"passed","title":"should have index_de.html","duration":4.914620999999897,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_es.html","status":"passed","title":"should have index_es.html","duration":4.975083999999924,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_fi.html","status":"passed","title":"should have index_fi.html","duration":5.9094239999999445,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_fr.html","status":"passed","title":"should have index_fr.html","duration":5.428592999999864,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_he.html","status":"passed","title":"should have index_he.html","duration":5.049984999999879,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_ja.html","status":"passed","title":"should have index_ja.html","duration":5.384671000000026,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_ko.html","status":"passed","title":"should have index_ko.html","duration":5.134763000000021,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_nl.html","status":"passed","title":"should have index_nl.html","duration":5.0388940000000275,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_no.html","status":"passed","title":"should have index_no.html","duration":5.03053900000009,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_sv.html","status":"passed","title":"should have index_sv.html","duration":6.335581000000047,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Main page HTML files exist for all 14 languages"],"fullName":"Dashboard-CSV Data Integrity Main page HTML files exist for all 14 languages should have index_zh.html","status":"passed","title":"should have index_zh.html","duration":5.565860000000157,"failureMessages":[],"location":{"line":290,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for en (default)","status":"passed","title":"should have politician dashboard for en (default)","duration":5.224250999999867,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for ar","status":"passed","title":"should have politician dashboard for ar","duration":5.201207999999951,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for da","status":"passed","title":"should have politician dashboard for da","duration":5.139942999999903,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for de","status":"passed","title":"should have politician dashboard for de","duration":5.458919999999807,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for es","status":"passed","title":"should have politician dashboard for es","duration":5.127550000000156,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for fi","status":"passed","title":"should have politician dashboard for fi","duration":5.149812000000111,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for fr","status":"passed","title":"should have politician dashboard for fr","duration":5.179576999999881,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for he","status":"passed","title":"should have politician dashboard for he","duration":5.190237000000025,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for ja","status":"passed","title":"should have politician dashboard for ja","duration":5.179787999999917,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for ko","status":"passed","title":"should have politician dashboard for ko","duration":5.349294999999984,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for nl","status":"passed","title":"should have politician dashboard for nl","duration":5.411611999999877,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for no","status":"passed","title":"should have politician dashboard for no","duration":5.3193389999999,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for sv","status":"passed","title":"should have politician dashboard for sv","duration":5.830726000000141,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have politician dashboard for zh","status":"passed","title":"should have politician dashboard for zh","duration":5.344625999999835,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for en (default)","status":"passed","title":"should have political intelligence for en (default)","duration":5.377036000000089,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for ar","status":"passed","title":"should have political intelligence for ar","duration":5.529381000000058,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for da","status":"passed","title":"should have political intelligence for da","duration":5.361327000000074,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for de","status":"passed","title":"should have political intelligence for de","duration":5.5581459999998515,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for es","status":"passed","title":"should have political intelligence for es","duration":8.511514999999918,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for fi","status":"passed","title":"should have political intelligence for fi","duration":5.6767979999999625,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for fr","status":"passed","title":"should have political intelligence for fr","duration":5.516658000000007,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for he","status":"passed","title":"should have political intelligence for he","duration":5.3816249999999854,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for ja","status":"passed","title":"should have political intelligence for ja","duration":5.549710000000005,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for ko","status":"passed","title":"should have political intelligence for ko","duration":5.412943999999925,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for nl","status":"passed","title":"should have political intelligence for nl","duration":5.462737999999945,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for no","status":"passed","title":"should have political intelligence for no","duration":5.489045999999917,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for sv","status":"passed","title":"should have political intelligence for sv","duration":5.604763000000048,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should have political intelligence for zh","status":"passed","title":"should have political intelligence for zh","duration":5.615072000000055,"failureMessages":[],"location":{"line":304,"column":9},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index.html","status":"passed","title":"should promote Political Intelligence on index.html","duration":7.106044000000111,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index.html","duration":6.595276999999896,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_ar.html","status":"passed","title":"should promote Political Intelligence on index_ar.html","duration":5.876492000000098,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_ar.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_ar.html","duration":5.8984629999999925,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_da.html","status":"passed","title":"should promote Political Intelligence on index_da.html","duration":5.946803999999929,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_da.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_da.html","duration":6.277471999999989,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_de.html","status":"passed","title":"should promote Political Intelligence on index_de.html","duration":6.579126999999971,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_de.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_de.html","duration":7.164663000000019,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_es.html","status":"passed","title":"should promote Political Intelligence on index_es.html","duration":5.963223999999855,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_es.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_es.html","duration":5.772607999999991,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_fi.html","status":"passed","title":"should promote Political Intelligence on index_fi.html","duration":5.589024000000109,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_fi.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_fi.html","duration":5.902659999999969,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_fr.html","status":"passed","title":"should promote Political Intelligence on index_fr.html","duration":6.1807410000001255,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_fr.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_fr.html","duration":6.01575200000002,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_he.html","status":"passed","title":"should promote Political Intelligence on index_he.html","duration":5.897420999999895,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_he.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_he.html","duration":5.748241999999891,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_ja.html","status":"passed","title":"should promote Political Intelligence on index_ja.html","duration":5.824804999999969,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_ja.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_ja.html","duration":6.546196000000009,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_ko.html","status":"passed","title":"should promote Political Intelligence on index_ko.html","duration":7.142381999999998,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_ko.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_ko.html","duration":7.100973999999951,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_nl.html","status":"passed","title":"should promote Political Intelligence on index_nl.html","duration":6.2275690000001305,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_nl.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_nl.html","duration":6.089079000000083,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_no.html","status":"passed","title":"should promote Political Intelligence on index_no.html","duration":6.0302399999998215,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_no.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_no.html","duration":6.769583999999895,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_sv.html","status":"passed","title":"should promote Political Intelligence on index_sv.html","duration":6.037814000000026,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_sv.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_sv.html","duration":7.133726000000024,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should promote Political Intelligence on index_zh.html","status":"passed","title":"should promote Political Intelligence on index_zh.html","duration":6.9788059999998495,"failureMessages":[],"location":{"line":315,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Political Intelligence localized page coverage"],"fullName":"Dashboard-CSV Data Integrity Political Intelligence localized page coverage should hide decorative Political Intelligence CTA feature emojis on index_zh.html","status":"passed","title":"should hide decorative Political Intelligence CTA feature emojis on index_zh.html","duration":6.369434999999839,"failureMessages":[],"location":{"line":322,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","stats-loader"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation stats-loader should have column \"object_name\" in at least one CSV","status":"passed","title":"should have column \"object_name\" in at least one CSV","duration":6.324971999999889,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","stats-loader"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation stats-loader should have column \"row_count\" in at least one CSV","status":"passed","title":"should have column \"row_count\" in at least one CSV","duration":6.066266999999925,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","stats-loader"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation stats-loader should have column \"status\" in at least one CSV","status":"passed","title":"should have column \"status\" in at least one CSV","duration":6.101924000000054,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation party-dashboard should have column \"party\" in at least one CSV","status":"passed","title":"should have column \"party\" in at least one CSV","duration":6.653054999999995,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation party-dashboard should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":6.917079999999942,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation party-dashboard should have column \"momentum\" in at least one CSV","status":"passed","title":"should have column \"momentum\" in at least one CSV","duration":6.867897999999968,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation party-dashboard should have column \"alignment_rate\" in at least one CSV","status":"passed","title":"should have column \"alignment_rate\" in at least one CSV","duration":6.645060000000058,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation party-dashboard should have column \"party1\" in at least one CSV","status":"passed","title":"should have column \"party1\" in at least one CSV","duration":6.319651000000022,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","party-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation party-dashboard should have column \"party2\" in at least one CSV","status":"passed","title":"should have column \"party2\" in at least one CSV","duration":6.076215999999931,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"election_cycle_id\" in at least one CSV","status":"passed","title":"should have column \"election_cycle_id\" in at least one CSV","duration":5.9924899999998615,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"party\" in at least one CSV","status":"passed","title":"should have column \"party\" in at least one CSV","duration":6.455355999999938,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"cycle_year\" in at least one CSV","status":"passed","title":"should have column \"cycle_year\" in at least one CSV","duration":6.669415999999956,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"overall_performance_score\" in at least one CSV","status":"passed","title":"should have column \"overall_performance_score\" in at least one CSV","duration":6.026382000000012,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"avg_approval_rate\" in at least one CSV","status":"passed","title":"should have column \"avg_approval_rate\" in at least one CSV","duration":6.179578999999876,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"forecast_confidence\" in at least one CSV","status":"passed","title":"should have column \"forecast_confidence\" in at least one CSV","duration":6.123884999999973,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"semester\" in at least one CSV","status":"passed","title":"should have column \"semester\" in at least one CSV","duration":6.174479999999903,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"total_ballots\" in at least one CSV","status":"passed","title":"should have column \"total_ballots\" in at least one CSV","duration":6.505288999999948,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","election-cycle"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation election-cycle should have column \"is_pre_election_semester\" in at least one CSV","status":"passed","title":"should have column \"is_pre_election_semester\" in at least one CSV","duration":6.586680999999999,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation committees-dashboard should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":6.650151000000051,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation committees-dashboard should have column \"committee\" in at least one CSV","status":"passed","title":"should have column \"committee\" in at least one CSV","duration":6.970389999999725,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation committees-dashboard should have column \"committee_code\" in at least one CSV","status":"passed","title":"should have column \"committee_code\" in at least one CSV","duration":6.703499999999622,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation committees-dashboard should have column \"productivity_level\" in at least one CSV","status":"passed","title":"should have column \"productivity_level\" in at least one CSV","duration":6.492816000000403,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","committees-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation committees-dashboard should have column \"quarter\" in at least one CSV","status":"passed","title":"should have column \"quarter\" in at least one CSV","duration":6.704643000000033,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"party\" in at least one CSV","status":"passed","title":"should have column \"party\" in at least one CSV","duration":6.758522999999968,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"party1\" in at least one CSV","status":"passed","title":"should have column \"party1\" in at least one CSV","duration":7.589477999999872,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"party2\" in at least one CSV","status":"passed","title":"should have column \"party2\" in at least one CSV","duration":6.422533999999814,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"alignment_rate\" in at least one CSV","status":"passed","title":"should have column \"alignment_rate\" in at least one CSV","duration":6.458662000000004,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"behavioral_assessment\" in at least one CSV","status":"passed","title":"should have column \"behavioral_assessment\" in at least one CSV","duration":9.357338000000254,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"anomaly_classification\" in at least one CSV","status":"passed","title":"should have column \"anomaly_classification\" in at least one CSV","duration":6.416983000000073,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"avg_rebellions\" in at least one CSV","status":"passed","title":"should have column \"avg_rebellions\" in at least one CSV","duration":6.329269999999724,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"politician_count\" in at least one CSV","status":"passed","title":"should have column \"politician_count\" in at least one CSV","duration":6.238329000000249,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"vote_count\" in at least one CSV","status":"passed","title":"should have column \"vote_count\" in at least one CSV","duration":6.236986999999772,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","coalition-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation coalition-dashboard should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":6.477606999999807,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"quarter\" in at least one CSV","status":"passed","title":"should have column \"quarter\" in at least one CSV","duration":6.530967000000146,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"total_ballots\" in at least one CSV","status":"passed","title":"should have column \"total_ballots\" in at least one CSV","duration":6.318087999999989,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"attendance_rate\" in at least one CSV","status":"passed","title":"should have column \"attendance_rate\" in at least one CSV","duration":6.457629999999881,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"documents_produced\" in at least one CSV","status":"passed","title":"should have column \"documents_produced\" in at least one CSV","duration":6.385203999999703,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"ballot_z_score\" in at least one CSV","status":"passed","title":"should have column \"ballot_z_score\" in at least one CSV","duration":6.316165000000183,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"doc_z_score\" in at least one CSV","status":"passed","title":"should have column \"doc_z_score\" in at least one CSV","duration":6.4097099999999045,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":6.392957999999908,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"is_election_year\" in at least one CSV","status":"passed","title":"should have column \"is_election_year\" in at least one CSV","duration":6.402927999999974,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","seasonal-patterns"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation seasonal-patterns should have column \"seasonal_pattern_classification\" in at least one CSV","status":"passed","title":"should have column \"seasonal_pattern_classification\" in at least one CSV","duration":6.994716000000153,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","pre-election"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation pre-election should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":8.026988000000074,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","pre-election"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation pre-election should have column \"total_ballots\" in at least one CSV","status":"passed","title":"should have column \"total_ballots\" in at least one CSV","duration":6.9632769999998345,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","pre-election"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation pre-election should have column \"total_documents\" in at least one CSV","status":"passed","title":"should have column \"total_documents\" in at least one CSV","duration":6.693741999999929,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","pre-election"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation pre-election should have column \"is_election_year\" in at least one CSV","status":"passed","title":"should have column \"is_election_year\" in at least one CSV","duration":6.657605000000331,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","pre-election"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation pre-election should have column \"avg_party_win_rate\" in at least one CSV","status":"passed","title":"should have column \"avg_party_win_rate\" in at least one CSV","duration":6.48194599999988,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","pre-election"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation pre-election should have column \"avg_party_absence_rate\" in at least one CSV","status":"passed","title":"should have column \"avg_party_absence_rate\" in at least one CSV","duration":6.471495999999661,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","anomaly-detection"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation anomaly-detection should have column \"quarter\" in at least one CSV","status":"passed","title":"should have column \"quarter\" in at least one CSV","duration":7.975612000000183,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","anomaly-detection"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation anomaly-detection should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":8.396318999999949,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","anomaly-detection"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation anomaly-detection should have column \"anomaly_severity\" in at least one CSV","status":"passed","title":"should have column \"anomaly_severity\" in at least one CSV","duration":6.980407999999898,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","anomaly-detection"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation anomaly-detection should have column \"anomaly_type\" in at least one CSV","status":"passed","title":"should have column \"anomaly_type\" in at least one CSV","duration":7.601652000000286,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","anomaly-detection"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation anomaly-detection should have column \"max_z_score\" in at least one CSV","status":"passed","title":"should have column \"max_z_score\" in at least one CSV","duration":6.7860340000002,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"ministry_name\" in at least one CSV","status":"passed","title":"should have column \"ministry_name\" in at least one CSV","duration":6.611748999999691,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"documents_produced\" in at least one CSV","status":"passed","title":"should have column \"documents_produced\" in at least one CSV","duration":6.775744999999915,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"risk_level\" in at least one CSV","status":"passed","title":"should have column \"risk_level\" in at least one CSV","duration":6.620473999999831,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":6.928522000000157,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"ministry_code\" in at least one CSV","status":"passed","title":"should have column \"ministry_code\" in at least one CSV","duration":7.340773000000354,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"committee\" in at least one CSV","status":"passed","title":"should have column \"committee\" in at least one CSV","duration":6.805209999999988,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"approval_rate\" in at least one CSV","status":"passed","title":"should have column \"approval_rate\" in at least one CSV","duration":7.643630999999914,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","ministry-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation ministry-dashboard should have column \"total_proposals\" in at least one CSV","status":"passed","title":"should have column \"total_proposals\" in at least one CSV","duration":6.891933000000336,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","risk-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation risk-dashboard should have column \"party\" in at least one CSV","status":"passed","title":"should have column \"party\" in at least one CSV","duration":6.791274000000158,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"person_id\" in at least one CSV","status":"passed","title":"should have column \"person_id\" in at least one CSV","duration":6.753603999999996,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"first_name\" in at least one CSV","status":"passed","title":"should have column \"first_name\" in at least one CSV","duration":6.860855000000356,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"last_name\" in at least one CSV","status":"passed","title":"should have column \"last_name\" in at least one CSV","duration":7.0119380000001,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"risk_level\" in at least one CSV","status":"passed","title":"should have column \"risk_level\" in at least one CSV","duration":6.741913000000295,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"risk_score\" in at least one CSV","status":"passed","title":"should have column \"risk_score\" in at least one CSV","duration":6.891442000000097,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"experience_level\" in at least one CSV","status":"passed","title":"should have column \"experience_level\" in at least one CSV","duration":7.157199999999648,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"politician_count\" in at least one CSV","status":"passed","title":"should have column \"politician_count\" in at least one CSV","duration":6.962225000000217,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","politician-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation politician-dashboard should have column \"influence_classification\" in at least one CSV","status":"passed","title":"should have column \"influence_classification\" in at least one CSV","duration":6.854021999999986,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"party\" in at least one CSV","status":"passed","title":"should have column \"party\" in at least one CSV","duration":6.893285999999989,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"year\" in at least one CSV","status":"passed","title":"should have column \"year\" in at least one CSV","duration":7.570553000000018,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"risk_level\" in at least one CSV","status":"passed","title":"should have column \"risk_level\" in at least one CSV","duration":6.978935999999976,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"politician_count\" in at least one CSV","status":"passed","title":"should have column \"politician_count\" in at least one CSV","duration":7.973789000000124,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"status\" in at least one CSV","status":"passed","title":"should have column \"status\" in at least one CSV","duration":6.966973000000053,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"alignment_rate\" in at least one CSV","status":"passed","title":"should have column \"alignment_rate\" in at least one CSV","duration":6.9802480000003015,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"ministry_name\" in at least one CSV","status":"passed","title":"should have column \"ministry_name\" in at least one CSV","duration":7.024621000000025,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Dashboard CSV column validation","cia-dashboard"],"fullName":"Dashboard-CSV Data Integrity Dashboard CSV column validation cia-dashboard should have column \"effectiveness_assessment\" in at least one CSV","status":"passed","title":"should have column \"effectiveness_assessment\" in at least one CSV","duration":7.045300000000225,"failureMessages":[],"location":{"line":412,"column":11},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Extraction summary row count validation"],"fullName":"Dashboard-CSV Data Integrity Extraction summary row count validation extraction_summary_report.csv should have at least 100 rows","status":"passed","title":"extraction_summary_report.csv should have at least 100 rows","duration":7.230005999999776,"failureMessages":[],"location":{"line":425,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Extraction summary row count validation"],"fullName":"Dashboard-CSV Data Integrity Extraction summary row count validation should contain view entries matching dashboard source views","status":"passed","title":"should contain view entries matching dashboard source views","duration":7.585802000000058,"failureMessages":[],"location":{"line":433,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","Extraction summary row count validation"],"fullName":"Dashboard-CSV Data Integrity Extraction summary row count validation all source views should have success status","status":"passed","title":"all source views should have success status","duration":7.767111000000114,"failureMessages":[],"location":{"line":458,"column":5},"meta":{},"tags":[]},{"ancestorTitles":["Dashboard-CSV Data Integrity","CSV data quality summary"],"fullName":"Dashboard-CSV Data Integrity CSV data quality summary should report all empty/header-only CSV files in cia-data","status":"passed","title":"should report all empty/header-only CSV files in cia-data","duration":159.87970300000006,"failureMessages":[],"location":{"line":488,"column":5},"meta":{},"tags":[]}],"startTime":1787953676247,"endTime":1787953678224.8796,"status":"passed","message":"","name":"/home/runner/work/riksdagsmonitor/riksdagsmonitor/tests/dashboard-csv-integrity.test.js"},{"assertionResults":[{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant file exists","status":"passed","title":"file exists","duration":5.584515999999894,"failureMessages":[],"location":{"line":75,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant plausible size (8 KB – 80 KB)","status":"passed","title":"plausible size (8 KB – 80 KB)","duration":0.9091519999999491,"failureMessages":[],"location":{"line":80,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant attribute matches BCP-47 en","status":"passed","title":" attribute matches BCP-47 en","duration":0.7889569999999821,"failureMessages":[],"location":{"line":86,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant dir attribute is ltr","status":"passed","title":"dir attribute is ltr","duration":0.6176759999998467,"failureMessages":[],"location":{"line":92,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant canonical link points at the correct slug + language","status":"passed","title":"canonical link points at the correct slug + language","duration":0.7056410000000142,"failureMessages":[],"location":{"line":101,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant hreflang chain has all 14 langs + x-default with \"nb\" for Norwegian","status":"passed","title":"hreflang chain has all 14 langs + x-default with \"nb\" for Norwegian","duration":1.4060320000000956,"failureMessages":[],"location":{"line":108,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant Open Graph + Twitter Card meta present","status":"passed","title":"Open Graph + Twitter Card meta present","duration":0.9796739999999318,"failureMessages":[],"location":{"line":124,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant JSON-LD @graph parses and contains a BreadcrumbList","status":"passed","title":"JSON-LD @graph parses and contains a BreadcrumbList","duration":2.079042999999956,"failureMessages":[],"location":{"line":132,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant exposes container #party-dashboard","status":"passed","title":"exposes container #party-dashboard","duration":0.6419619999999213,"failureMessages":[],"location":{"line":145,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant has back-to-home navigation","status":"passed","title":"has back-to-home navigation","duration":0.7015939999998864,"failureMessages":[],"location":{"line":150,"column":7},"meta":{},"tags":[]},{"ancestorTitles":["Specialised dashboard pages — structural contract","'parties'","'en' variant"],"fullName":"Specialised dashboard pages — structural contract 'parties' 'en' variant related-dashboards