methodology-reflection.md

May 26, 2026 · View on GitHub

Hack23 Logo

🔬 Methodology Reflection Template

📊 After-Action Review of the Run's Analytical Quality
🎯 Self-Audit · Pass-2 Evidence · Quality-Gate Score · Improvement Backlog

Owner Version Effective Date Classification

📋 Document Owner: CEO | 📄 Version: 1.1 | 📅 Last Updated: 2026-04-25 (UTC) 🏢 Owner: Hack23 AB (Org.nr 5595347807) | 🏷️ Classification: Public

📌 Template instructions: Produce for every run as a required run-audit gate. Save as analysis/daily/${ARTICLE_DATE}/${DOC_TYPE}/methodology-reflection.md. Honest self-audit — this feeds the next methodology update and must not be skipped.

✨ What to produce: Proof that the 7-step protocol was followed, the quality-gate score was met, the pass-2 rewrite actually changed sections, and a specific backlog of methodology improvements the next run should adopt.


📐 Template Contract — every fill of this template MUST satisfy this row.

SlotValue
Owning methodologyper-artifact-methodologies.md
Owning gate checkCheck 7 (Family C — ICD 203 audit) + Check 6 (Pass-2 mtime) — see 05-analysis-gate.md
Required inputsevery other artifact in the run
Horizon bandper-run (per scripts/horizon-context.ts)
Output familyFamily C — Strategic Extensions
Aggregation order29 of 30 in canonical order (see scripts/render-lib/aggregator/order.ts)
Reader Intelligence Guiderow generated from methodology-reflection.md (see scripts/render-lib/aggregator/reader-guide.ts)
Canonical evidence anchor| claim | evidence (dok_id / vote / MP intressent_id / primary-source URL) | retrieved_at | confidence | — every analytical claim row uses this schema.

Cross-reference: README.md §Template ↔ Methodology ↔ Gate-Check Matrix.

🔄 Tradecraft Context

ElementValue
F3EAD StageANALYZE (meta-level) — quality assurance and process improvement
PIRs ServedNo direct PIR; ensures all PIR-serving outputs meet tradecraft standards
Admiralty FloorN/A (self-audit references same sources as assessed files)
WEP + ODNIConfidence distribution audit uses existing scale; no new probability claims
Source Diversity FloorAUDIT TARGET — this file checks that all other files met Source Diversity Rule (P0: ≥4, P1: ≥3, P2: ≥2); reports violations
SAT(s) AppliedKey Assumptions Check (audit own assumptions), Quality of Information Check (source audit)
ICD 203 StandardsALL 9 (this file audits ICD 203 compliance across the run)

📋 Reflection Context

FieldValue
Reflection IDMET-YYYY-MM-DD-NNN
GeneratedYYYY-MM-DD HH:MM UTC
Workflowe.g., news-morning-propositions
Run durationminutes
Files producedN
Exemplar statusYes / No — and why

Pass-2 status: executed in full (required literal — 05-analysis-gate.md greps for this exact phrase, with the colon, outside the table cell.)


✅ Required Section Contract (Gate-Enforced)

[REQUIRED] methodology-reflection.md is invalid unless all sections below are present (as ## headings) and completed. The canonical heading text is given here; the template renders each heading with a leading emoji (e.g. ## 📋 ICD 203 …) and the gate accepts an optional leading emoji on each heading. The section name must match exactly.

  1. ## 📋 ICD 203 Analytic Tradecraft Compliance Audit
  2. ## 🎯 Devil's-Advocate Key Judgment Coverage Matrix
  3. ## 📈 Confidence Distribution by Key Judgment (Posterior Required)
  4. ## ⚖️ Lagrådet / Statskontoret / SKR Tracking
  5. ## 🔗 Sibling-Folder Ingestion Record (Tier-C)
  6. ## 🔁 Re-run Log (Unified Schema)
  7. ## 🚫 Banned-Phrase Audit (Zero-Count Grid)
  8. ## 🔄 Pass 1 → Pass 2 Delta Table
  9. ## 🧭 Improvement Opportunities → PIR Roll-Forward

Beyond presence, the gate also enforces:

  • Devil's-Advocate KJ Coverage Matrix: no rows remain and no OPEN statuses remain for KJ rows (coverage must be 100%).
  • Confidence Distribution: every KJ row has a filled Posterior value (no [REQUIRED] placeholder, no empty cell).
  • Re-run Log: the unified column schema (run_id | attempt | new dok_ids | artifacts extended | flags closed | vintage refresh) is present as a markdown table header.

🎯 Devil's-Advocate Key Judgment Coverage Matrix

[REQUIRED] Every KJ in intelligence-assessment.md must be challenged at least once in devils-advocate.md. Coverage must be 100% before gate pass.

KJ IDKJ summaryChallenged in devils-advocate.md?Counter-evidence row IDStatus
KJ-1[REQUIRED: judgement summary]✅ / ❌DA-##OPEN / CLOSED
KJ-2[REQUIRED: judgement summary]✅ / ❌DA-##OPEN / CLOSED
KJ-3[REQUIRED: judgement summary]✅ / ❌DA-##OPEN / CLOSED
...............
CoverageN / N KJsMust be 100%

📈 Confidence Distribution by Key Judgment (Posterior Required)

[REQUIRED] Explicit posterior confidence per KJ. Missing posterior values are gate failures.

KJ IDPrior (Pass 1)Evidence update in Pass 2 / Re-runPosterior (required)Change rationale
KJ-1[REQUIRED][REQUIRED][REQUIRED][REQUIRED]
KJ-2[REQUIRED][REQUIRED][REQUIRED][REQUIRED]
KJ-3[REQUIRED][REQUIRED][REQUIRED][REQUIRED]

⚖️ Lagrådet / Statskontoret / SKR Tracking

[REQUIRED] Track external implementation/legal-review signals. Use lagradet-tracking.md as the canonical field fragment — the Impact note column below mirrors the fragment's required impact_note field.

TrackApplicabilityStatusLatest evidence (URL + date)Next checkImpact note
Lagrådet yttrandeY/Nnot applicable / referral pending / yttrande published[REQUIRED][REQUIRED][REQUIRED]
Statskontoret implementation signalY/Nfound / none found / not triggered[REQUIRED][REQUIRED][REQUIRED]
SKR operational impact signalY/Nfound / none found / not triggered[REQUIRED][REQUIRED][REQUIRED]

🔗 Sibling-Folder Ingestion Record (Tier-C)

[REQUIRED for Tier-C; REQUIRED to mark N/A for non-Tier-C]

Sibling folderArtifact citedWhy ingestedImpact on current KJ / scenarioCitation
[REQUIRED or N/A][REQUIRED or N/A][REQUIRED or N/A][REQUIRED or N/A][REQUIRED or N/A]

🔁 Re-run Log (Unified Schema)

[REQUIRED] Use this exact schema for every same-day improvement re-run.

run_idattemptnew dok_idsartifacts extendedflags closedvintage refresh
[REQUIRED][REQUIRED][comma-separated or none][comma-separated list][count + ids][IMF/SCB/other + result]

🚫 Banned-Phrase Audit (Zero-Count Grid)

[REQUIRED] All banned phrases must be zero in final analysis + article.

PhraseCountLocationStatus
intelligence theatre0
sources say0
reportedly0
it is widely believed0
experts agree0
AI_MUST_REPLACE0

🔄 Pass 1 → Pass 2 Delta Table

[REQUIRED] Show measurable change; narrative-only statements are insufficient.

ArtifactPass 1 baselinePass 2 (or re-run) stateDeltaWhy it changed
[REQUIRED][REQUIRED][REQUIRED][REQUIRED][REQUIRED]

🧭 Improvement Opportunities → PIR Roll-Forward

[REQUIRED] Convert every unresolved methodology gap into a tracked PIR action.

Improvement opportunitySeverityLinked PIR (pir-status.json)OwnerDue dateRoll-forward status
[REQUIRED]HIGH/MED/LOWPIR-...[REQUIRED]YYYY-MM-DDOPEN / ANSWERED / DEFERRED

🧭 7-Step Protocol Compliance

⚠️ Illustrative example below — replace every status marker, count, and note with run-specific findings before publishing. The completion marks, file counts, and missed-file names shown here are drawn from a worked example and must not be shipped as pre-audited results.

flowchart LR
    S1["1️⃣ Prepare"] --> S2["2️⃣ Download"] --> S3["3️⃣ Per-File"] --> S4["4️⃣ Core Synthesis"] --> S5["5️⃣ Extensions"] --> S6["6️⃣ Quality Gate"] --> S7["7️⃣ Pass-2"]

    style S1 fill:#4CAF50,color:#FFFFFF
    style S2 fill:#4CAF50,color:#FFFFFF
    style S3 fill:#4CAF50,color:#FFFFFF
    style S4 fill:#4CAF50,color:#FFFFFF
    style S5 fill:#FFC107,color:#000000
    style S6 fill:#4CAF50,color:#FFFFFF
    style S7 fill:#FF9800,color:#FFFFFF
StepCompleted?EvidenceNotes
1 PrepareMethodologies read; citations present in output
2 Downloaddata-download-manifest.md present, N documents, data-depth table completeManifest complete
3 Per-fileN analyses in documents/, all with ≥ 1 Mermaid
4 Core synthesisAll 9 Family A files + 2 Family B files
5 Extensions🟡Only 3 of 5 triggered files producedMissed comparative-international despite P0 doc
6 Quality gateComposite score 8.01
7 Pass-2 rewrite🟡8 of 11 files measurably rewrittenSynthesis + SWOT still Pass-1

🏁 Quality-Gate Scorecard

⚠️ Illustrative example below — replace every numeric score and evidence note with run-specific values before publishing. The scores, weighted totals, and evidence summaries shown here are drawn from a worked example and must not be shipped as real metrics.

DimensionWeightScore (/10)WeightedEvidence
📎 Evidence25%8.52.1394 dok_id citations across outputs
📐 Depth25%8.02.00L2+ applied on all P1 docs
📋 Structural20%8.51.70All Mermaid color-coded; 2 missing doc-control blocks
🎯 Actionable15%7.51.1311 of 14 forward indicators dated
⚖️ Neutrality15%7.01.05Two SWOT entries imbalanced toward government
Composite8.01✅ pass (threshold 7.0)

✏️ Pass-2 Evidence — Before vs After

Warning

Illustrative example — replace before publishing. The table below (and the subsequent Content Metrics, What Worked, What to Improve, and Backlog sections) carries worked-example content — named ministers, dok_ids, before/after ledes, word counts, citation counts, and specific "fix for next run" entries — from a prior reference run. Replace every row with run-specific Pass-2 evidence, metrics, and retrospection before committing this file; do not ship the example values as if they were produced by the current run.

FileBefore Pass-2 (lede snippet)After Pass-2 (lede snippet)Improvement
synthesis-summary.md"The government tabled several propositions today.""Finance Minister Elisabeth Svantesson (M) tabled the 2026 Spring Bill (HD03100) alongside an extra amendment budget (HD0399) and three fiscal support measures."🟢 Named actor + dok_ids added
swot-analysis.md — Opportunities Q1"Potential for cross-party support.""Cross-party support from SD on sentencing (HD01JuU15) extends to fuel-tax package (HD03236)."🟢 Specific cross-reference added
executive-brief.md — BLUF"Coalition shows discipline.""Coalition unanimous on FiU48 (confidence 🟩 HIGH; L reservation noted separately)."🟢 Confidence qualifier added

Re-run log

  • Re-run: YYYY-MM-DD HH:MM UTC · workflow=GITHUBWORKFLOWrunid=GITHUB_WORKFLOW · run_id=GITHUB_RUN_ID · attempt=$GITHUB_RUN_ATTEMPT
    • new dok_ids: <count or "none">
    • artifacts extended: <comma-separated list or "none — content stable">
    • flags closed:
    • vintage refresh: <"yes" or "no, IMF WEO Apr-2026 still current">

📊 Content Metrics

Include IMF provenance and Statskontoret coverage in this section whenever relevant. Economic claims without IMF vintage/provenance or implementation claims without a Statskontoret search note are methodology gaps, even if the rest of the gate passes.

MetricTargetActualStatus
Total word count across Family A≥ 5 0007 320🟢
Mermaid diagrams (total)≥ 1219🟢
dok_id citations (total)≥ 4094🟢
Named actors (total)≥ 2037🟢
Forward indicators with dates≥ 811🟢
🟢 Low-confidence claims flaggedall6 of 6 flagged🟢
🔴 Unresolved TODOs / placeholders00🟢
Banned phrases detected0N🟢 = 0 · 🔴 > 0 (see political-style-guide.json)
Citation density (article)≤ 200 words/anchorN🟢 ≤ threshold · 🟡 ≤ 1.5× · 🔴 > 1.5×
Stale economicProvenance (>6mo)0 unannotatedN🟢 = 0 · 🟡 annotated · 🔴 unannotated stale
Pass-2 net change≥ 5% (word count + citations)N%🟢 ≥ 5% · 🟡 3–5% · 🔴 < 3% (cosmetic-only)
Full-text fetched (top-N by DIW)≥ 3 (≥ 5 Tier-C)N of N🟢 ≥ floor · 🟡 1 below · 🔴 > 1 below
L2+ docs without full text0N🟢 = 0 · 🟡 1–2 · 🔴 ≥ 3
Prior-voteringar enrichment≥ 1 entry per committee touchedN rows in data-download-manifest.md §Prior-Voteringar Enrichment🟢 all committees covered · 🟡 ≥ 50% covered · 🔴 < 50% covered
Statskontoret pre-warmtrigger-checked + recordedtriggered: Y/N · result: source URL / "no source found" / "no trigger matched"🟢 trigger evaluated + result recorded · 🟡 evaluated, source not found despite trigger · 🔴 trigger not evaluated
IMF pre-warmalways (vintage + indicator)WEO {Apr-2026 / current vintage} · {indicators used}🟢 current vintage (≤ 6 months) · 🟡 stale vintage with annotation · 🔴 not pre-warmed
Lagrådet tracking (major bills only)referral status recordednot applicable / referral pending / yttrande {URL + date}🟢 status recorded · 🟡 referral pending tagged · 🔴 applicable but not checked
Party [unconfirmed] flagsevery empty-parti row taggedN flags · N closed via search_ledamoter🟢 all flagged or closed · 🟡 ≥ 80% flagged · 🔴 inferred without flag
Election-proximity multiplier (1.5×)applied when election ≤ 6 monthsapplied: Y/N · scope: opposition motions / contested propositions🟢 applied · 🟡 N/A (outside window)
Withdrawn documentslisted not silently droppedN rows in data-download-manifest.md §Withdrawn Documents🟢 all listed · 🟡 N/A (none in batch)
PIR carry-forwardprior-cycle PIRs read at pre-warmN open PIRs ingested · N closed this run🟢 read at pre-warm · 🟡 read end-of-cycle · 🔴 not read
Single-agent review substitute — three-component non-ICD controlall 3 evidencedPass 2 ✅/❌ · Devil's Advocate ✅/❌ · Cross-folder/Prior-cycle citation ✅/❌🟢 all 3 ✅ · 🟡 2/3 ✅ · 🔴 ≤ 1/3 ✅

🌐 Data Source Connectivity Audit

[REQUIRED] — Record the live connectivity status of every external data source attempted during this run. This feeds the improvement backlog and enables tracking of systematic fetch failures across runs.

SourceEndpointStatusFallback UsedNotes
IMF WEOtsx scripts/imf-fetch.ts weo🟢 live / 🟡 cached / 🔴 failedY/Nvintage: {WEO-MMM-YYYY}
IMF SDMXtsx scripts/imf-fetch.ts sdmx🟢 live / 🔴 failedN/Adataflow: {e.g. CPI, IFS}
Riksdag MCPriksdag-regering🟢 live / 🔴 failedN/Async time: {ISO timestamp}
Statskontoretweb_fetch statskontoret.se🟢 live / 🟡 no trigger / 🔴 blockedN/A
Lagrådetweb_fetch lagradet.se🟢 live / 🟡 N/A / 🔴 blockedN/A
SCBscb MCP🟢 live / 🟡 not needed / 🔴 failedN/A
World Bankworld-bank MCP🟢 live / 🟡 not needed / 🔴 failedN/Anon-economic only

IMF fallback hierarchy (codified in scripts/imf-fetch.ts):

  1. Live fetch → persist result with --persist
  2. If live fails → load from analysis/data/imf/{indicator}/{country}.json cache
  3. If cache is >6 months old → annotate with >6 month vintage warning
  4. If no cache exists → report as 🔴 in this table and flag in §What to Improve

🧪 Recurring Data-Quality Patterns — Pass-2 Scan

[REQUIRED in Pass-2] — Scan the run's data-download-manifest.md for the six recurring failure modes catalogued from prior reflections. For each pattern, record whether it was encountered and whether the prescribed remediation in .github/prompts/03-data-download.md was applied. A pattern that fired without the documented remediation is a Pass-2 improvement target and rolls forward to §Improvement Opportunities → PIR Roll-Forward.

#PatternSymptom in manifestDocumented remediationEncountered?Remediation applied?
1search_voteringar 0-result with bet-prefix"API returned 0 results — likely indexing lag" while other queries return votesUse avser + rm, full <rm>:<bet>, or unfiltered + post-filter (03-data-download.md §Prior-voteringar enrichment)☐ yes ☐ no☐ yes ☐ no ☐ N/A
2Pre-publication committee documentsDokumentet är inte publicerat body, status: planerat, future scheduled dateTag coverage_state: pre_publication, add to Deferred Retrieval Queue with retryAfter, downgrade derived-claim confidence☐ yes ☐ no☐ yes ☐ no ☐ N/A
3Proposition HTML-wrapper extraction failurefull_text_available: true but extracted plaintext < 400 chars / dominated by CSSTag coverage_state: pdf_html_wrapper, set full_text_available: partial, downgrade content-extraction confidence to 🟧 MEDIUM with explicit pdf_html_wrapper reason☐ yes ☐ no☐ yes ☐ no ☐ N/A
4Statskontoret root-domain missStatskontoret: no directly relevant source found after a single web_fetch https://www.statskontoret.se/Fetch /publikationer/, agency-scoped landing pages, or ?s={keyword}; cite the specific page URL, not the root domain☐ yes ☐ no☐ yes ☐ no ☐ N/A
5Lagrådet "referral pending" without index scanLagrådet: referral pending recorded after only a root-domain fetchScan /yttranden/ (year-filtered), then site:lagradet.se external fallback; cite the index URL in the manifest line☐ yes ☐ no☐ yes ☐ no ☐ N/A
6Manifest schema driftRequired sections (Coverage State, Full-Text Fetch Outcomes, Deferred Retrieval Queue, Prior-Voteringar, Statskontoret, Lagrådet, PIR Carry-Forward, Withdrawn) missing or renamed vs analysis/templates/data-download-manifest.mdRestore the canonical headings exactly; do not invent variant names☐ yes ☐ no☐ yes ☐ no ☐ N/A

If any pattern is marked "Encountered: yes / Remediation applied: no", open a corresponding row in §🧱 What to Improve with the concrete fix and add a PIR row in §🧭 Improvement Opportunities → PIR Roll-Forward.


🎓 What Worked

  • Pass-2 rewrite substantially sharpened synthesis-summary.md §Finding 1 by adding SEK-denominated figures and SIFO polling gap.
  • Cross-reference map XR-01 (fiscal cluster) made the synthesis narrative visibly tighter.
  • ACH in devils-advocate.md surfaced a risk (EU state-aid review) that the main risk register had not yet flagged.

🧱 What to Improve

#AreaGapConcrete fix for next run
1Extensions trigger logicP0 doc did not trigger comparative-international.mdAdd "P0 = mandatory comparative" rule to Step 5 checklist
2Synthesis Pass-2Lede still reads like a docket, not a storyRewrite lede to open with the #1 DIW finding, not a document count
3SWOT neutralityTwo Q1 entries lack opposition framingPair every government strength with an opposition-framed threat
4Forward indicatorsThree indicators have no explicit dateRequire ISO date or committee session ID
5Language coverageOnly EN + SV produced; DA/NB pendingSchedule translation workflow slot earlier

🔁 Backlog for Methodology Updates

#ProposalTarget filePriority
B1Codify "P0 → comparative-international" as a mandatory triggerai-driven-analysis-guide.md Step 5🟠 HIGH
B2Add lede-rewrite rule to synthesis templatesynthesis-summary.md🟠 HIGH
B3Add SWOT pairing rule ("every strength paired with an opposition threat")political-swot-framework.md🟡 MEDIUM
B4Require ISO date / committee-session ID for every forward indicatorforward-indicators.md🟡 MEDIUM

📋 ICD 203 Analytic Tradecraft Compliance Audit

[REQUIRED] — Every methodology-reflection.md must include this ICD 203 compliance checklist. All 9 standards must pass for the workflow to be considered compliant.

Warning

Illustrative example — replace before publishing. The checklist rows, status markers, and evidence cells below are worked-example values from a prior reference run and must be replaced with run-specific status and evidence before this file is committed. Do not ship pre-filled ✅ markers or an overall COMPLIANT verdict without having reassessed every standard for the current run.

ICD 203 StandardStatusEvidence
1. Source quality describedAll evidence tables have Admiralty codes [A–F][1–6]
2. Uncertainty expressedWEP + ODNI confidence overlay used for all forward-looking claims
3. Judgments vs assumptions distinguishedAssumptions section in intelligence-assessment.md
4. Alternative analysis incorporatedACH matrix in devils-advocate.md with ≥3 hypotheses
5. Customer relevance demonstrated3 decisions named in executive-brief.md
6. Logical argumentation usedEvidence chains traced in all synthesis files
7. Consistency explainedChangelog in document control blocks
8. Accurate judgments madeQuality gate score 8.01/10
9. Visual information incorporated19 Mermaid diagrams across workflow

Single-agent review substitute (separate non-ICD internal control): news workflows run as a single AI agent. Per 04-analysis-pipeline.md §Single-agent review substitute, this control requires all three components evidenced — (a) Pass 2 read-back, (b) Devil's Advocate / ACH ≥ 3 hypotheses, (c) cross-folder peer citation (Tier-C) or prior-cycle citation (single-type). State which components were satisfied in the §Content Metrics row; if any is missing, surface the gap as the top item in §What to Improve. ICD 203 Standard 9 keeps its established repository meaning — assess it separately above using the existing terminology, not via this substitute control.

ICD 203 Compliance Status: [SELECT: ✅ COMPLIANT / ❌ NON-COMPLIANT]


🏆 Exemplar Assessment

CriterionMet?Notes
Composite quality-gate score ≥ 8.08.01
All 9 Family A files present
≥ 1 Mermaid per fileAverage 1.7
Pass-2 rewrite documentedSee section above
Two or more Family C + D files completed with depth adapted to DIW tierIllustrative example — all Family C (5) and Family D (7) files are always produced; depth adapted by DIW tier per Step 5 contract

Verdict: Eligible as reference exemplar for ${DOC_TYPE} workflow template set.


Document Control