关于 osint-methodologies
面向 Riksdagsmonitor 的 OSINT 方法技能,供收集瑞典政治公开信息的团队使用。内容涵盖来源评估、交叉核验、数据质量以及法律与隐私保障。
主要功能
- 01四类公开数据源框架
- 02来源可靠性与完整性评估
- 03跨来源核验方法
- 04数据新鲜度与准确性检查
- 05GDPR 与隐私审查指引
适用场景
- 01规划政治公开数据采集
- 02检查来源可靠性与覆盖度
- 03跨独立来源核验记录
- 04为采集管道设计质量控制
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hack23/ riksdagsmonitor --skill osint-methodologies安装后在 Claude Code 中输入/osint-methodologies确认已加载。
详细介绍
OSINT 方法论技能
🔴 AI FIRST 质量原则
遵循 AI FIRST 原则:绝不接受首次产出的质量。至少迭代 2 次。阅读所有输出,改进每个部分。不得走捷径。
用途
此技能提供全面的开源情报(OSINT)收集方法,专为 Riksdagsmonitor(Riksdagsmonitor)平台的使命量身定制,致力于促进瑞典的民主透明度和政治问责。它确保从公开来源以合乎道德、合法且有效的方式收集情报,同时遵守 GDPR 并尊重隐私原则。
何时使用此技能
在以下情况下使用此技能:
- ✅ 集成新的公共数据源(政府 API、开放数据集)
- ✅ 评估数据源的可靠性和完整性
- ✅ 为政治情报实施数据收集管道
- ✅ 从多个独立来源核实信息
- ✅ 通过来源交叉验证来确认准确性
- ✅ 针对新的情报需求设计 OSINT 收集策略
- ✅ 评估数据质量并制定质量指标
- ✅ 创建自动化数据采集和验证工作流
请勿用于:
- ❌ 收集非公开或机密信息
- ❌ 在缺乏明确公共利益依据的情况下抓取社交媒体
- ❌ 收集超出公职人员履职范围的个人数据
- ❌ 违反 GDPR 或瑞典隐私法律的情报收集
OSINT 收集框架
四大主要来源架构
Riksdagsmonitor 平台整合了四个高完整性的 OSINT 来源,以形成全面的政治情报:
graph TB
subgraph "OSINT Sources"
A1[📡 Riksdagen API<br/>98.5% completeness<br/>3.5M+ votes, 89K documents]
A2[📊 Election Authority<br/>99.2% completeness<br/>1970-present electoral data]
A3[💰 World Bank<br/>94.1% completeness<br/>598K indicators, 211 countries]
A4[🏛️ Financial Authority ESV<br/>97.8% completeness<br/>Monthly updates]
end
subgraph "Collection Layer"
A1 --> B[Data Ingestion Pipeline]
A2 --> B
A3 --> B
A4 --> B
end
subgraph "Quality Assurance"
B --> C{Source Verification}
C --> D[Completeness Check]
C --> E[Consistency Validation]
C --> F[Temporal Continuity]
C --> G[Cross-Reference Check]
end
subgraph "Data Integration"
D & E & F & G --> H[(Integrated Dataset)]
H --> I[Entity Resolution]
I --> J[Data Enrichment]
end
subgraph "Quality Metrics"
J --> K[📊 Quality Dashboard]
K --> L[Completeness: 97.4%]
K --> M[Accuracy: 99.1%]
K --> N[Timeliness: 24h lag]
end
style A1 fill:#e1f5ff
style A2 fill:#e1f5ff
style A3 fill:#e1f5ff
style A4 fill:#e1f5ff
style C fill:#ffeb99
style H fill:#ccffcc
style K fill:#ffe6cc
来源评估矩阵
1. Riksdagen API(瑞典议会)
来源概况:
- URL:https://data.riksdagen.se/
- 权威机构:瑞典议会(立法部门)
- 分类:一手来源,政府官方
- 完整率:98.5%
- 更新频率:每日(投票数据实时更新)
- 历史覆盖范围:1971 年至今(54 年)
- 数据量:350 多万条投票记录、8.9 万份文档、2500 名政治人物
质量指标:
@Component
public class RiksdagenSourceQualityMetrics {
public SourceQualityReport evaluateRiksdagenAPI() {
return SourceQualityReport.builder()
.sourceName("Riksdagen API")
.completeness(98.5) // Measured against expected records
.accuracy(99.8) // Verified via manual audit sampling
.timeliness(1.0) // Hours lag for new data
.reliability(5) // 1-5 scale, 5 = highest
.trustLevel("PRIMARY_SOURCE")
.legalBasis("Public Records Act (Offentlighetsprincipen)")
.gdprCompliance(true)
.updateFrequency("DAILY")
.build();
}
public List<DataGap> identifyDataGaps() {
// Example: Check for missing voting records
String sql = """
SELECT
COUNT(*) as expected_votes,
COUNT(DISTINCT ballot_id) as actual_votes,
COUNT(*) - COUNT(DISTINCT ballot_id) as missing_votes
FROM view_riksdagen_vote_daily_summary
WHERE created_date >= CURRENT_DATE - INTERVAL '30 days'
""";
// Calculate completeness percentage
return jdbcTemplate.query(sql, (rs, rowNum) ->
DataGap.builder()
.expectedRecords(rs.getInt("expected_votes"))
.actualRecords(rs.getInt("actual_votes"))
.missingRecords(rs.getInt("missing_votes"))
.completeness((double) rs.getInt("actual_votes") /
rs.getInt("expected_votes") * 100)
.build()
);
}
}
数据类别:
-
投票记录(
vote_data表)- 选票上的个人投票
- 党纪指标
- 联盟投票模式
- 投票趋势的时间变化
-
文档(
document_element、document_status_container)- 立法提案(motioner)
- 政府法案(propositioner)
- 委员会报告(utskottsbetänkanden)
- 议会质询(interpellationer)
-
政治人物(
person_data、assignment_data)- 议会职务和任命
- 委员会成员身份
- 党派归属
- 职业轨迹
-
议会活动
- 辩论参与情况
- 委员会工作
- 政府质询
- 发言时间
OSINT 技术:
-- Source Triangulation: Verify politician voting record completeness
WITH expected_votes AS (
SELECT
person_id,
COUNT(DISTINCT ballot_id) as riksdagen_vote_count
FROM vote_data
WHERE vote_date >= '2022-09-11' -- Current parliament
GROUP BY person_id
),
document_activity AS (
SELECT
person_id,
COUNT(DISTINCT document_id) as document_count
FROM document_person_reference_data
WHERE document_type IN ('mot', 'ip') -- Motions & Questions
GROUP BY person_id
)
SELECT
p.first_name || ' ' || p.last_name as politician_name,
p.party as party_affiliation,
ev.riksdagen_vote_count,
da.document_count,
CASE
WHEN ev.riksdagen_vote_count > 500 THEN 'ACTIVE'
WHEN ev.riksdagen_vote_count BETWEEN 100 AND 500 THEN 'MODERATE'
WHEN ev.riksdagen_vote_count < 100 THEN 'INACTIVE'
END as engagement_level
FROM person_data p
LEFT JOIN expected_votes ev ON p.person_id = ev.person_id
LEFT JOIN document_activity da ON p.person_id = da.person_id
WHERE p.status = 'Tjänstgörande riksdagsledamot' -- Active MPs
ORDER BY ev.riksdagen_vote_count DESC;
2. 选举管理局(Valmyndigheten)
来源概况:
- URL:https://www.val.se/
- 权威机构:瑞典选举管理局(独立机构)
- 分类:一手来源,政府官方
- 完整率:99.2%
- 更新频率:选举后(每 4 年一次,另有特别选举)
- 历史覆盖范围:1970 年至今(14 次选举)
- 数据量:40 个政党,涵盖全国和地区选举结果
质量指标:
@Component
public class ElectionAuthorityQualityMetrics {
public SourceQualityReport evaluateElectionAuthority() {
return SourceQualityReport.builder()
.sourceName("Valmyndigheten")
.completeness(99.2)
.accuracy(99.9) // Official certified results
.timeliness(168.0) // Hours post-election for final results
.reliability(5)
.trustLevel("PRIMARY_SOURCE")
.legalBasis("Election Act (Vallagen)")
.gdprCompliance(true)
.updateFrequency("ELECTION_CYCLE")
.build();
}
public List<ElectionDataValidation> validateElectionData() {
// Cross-reference with Riksdagen seat assignments
String sql = """
SELECT
e.party_name,
e.parliament_seats as election_authority_seats,
COUNT(DISTINCT a.person_id) as riksdagen_active_mps,
e.parliament_seats - COUNT(DISTINCT a.person_id) as seat_discrepancy
FROM sweden_political_party e
LEFT JOIN assignment_data a
ON e.party_id = a.party
AND a.role_code = 'Riksdagsledamot'
AND a.from_date <= CURRENT_DATE
AND (a.to_date IS NULL OR a.to_date >= CURRENT_DATE)
WHERE e.parliament_seats > 0
GROUP BY e.party_name, e.parliament_seats
HAVING e.parliament_seats != COUNT(DISTINCT a.person_id)
""";
return jdbcTemplate.query(sql, (rs, rowNum) ->
ElectionDataValidation.builder()
.partyName(rs.getString("party_name"))
.expectedSeats(rs.getInt("election_authority_seats"))
.actualSeats(rs.getInt("riksdagen_active_mps"))
.discrepancy(rs.getInt("seat_discrepancy"))
.build()
);
}
}
OSINT 技术:
-- Historical Election Trend Analysis
SELECT
party_name,
election_year,
percentage,
parliament_seats,
LAG(percentage, 1) OVER (PARTITION BY party_name ORDER BY election_year) as previous_percentage,
percentage - LAG(percentage, 1) OVER (PARTITION BY party_name ORDER BY election_year) as vote_swing,
LAG(parliament_seats, 1) OVER (PARTITION BY party_name ORDER BY election_year) as previous_seats,
parliament_seats - LAG(parliament_seats, 1) OVER (PARTITION BY party_name ORDER BY election_year) as seat_change
FROM sweden_political_party
WHERE parliament_seats IS NOT NULL
ORDER BY party_name, election_year DESC;
3. 世界银行开放数据
来源概况:
- URL:https://data.worldbank.org/
- 权威机构:世界银行(国际组织)
- 分类:二手来源,国际权威机构
- 完整率:94.1%
- 更新频率:每季度
- 历史覆盖范围:1960 年至今(64 年)
- 数据量:59.8 万项指标,涵盖 211 个国家
质量指标:
@Component
public class WorldBankQualityMetrics {
public SourceQualityReport evaluateWorldBankAPI() {
return SourceQualityReport.builder()
.sourceName("World Bank Open Data")
.completeness(94.1)
.accuracy(97.5)
.timeliness(2160.0) // 90 days lag (quarterly updates)
.reliability(4) // High but not primary source
.trustLevel("SECONDARY_SOURCE")
.legalBasis("Open Data License")
.gdprCompliance(true) // Aggregate data only
.updateFrequency("QUARTERLY")
.build();
}
}
使用场景:
- 为政治决策提供经济背景
- 国际比较基准
- 衡量政策成效
- 相关性分析(GDP 与政府支出)
4. 金融管理局(ESV)
来源概况:
- URL:https://www.esv.se/
- 主管机构:瑞典金融管理局
- 分类:一手来源,政府官方
- 完整度:97.8%
- 更新频率:每月
- 历史覆盖范围:1990 年至今
- 数据量:机构财务数据
OSINT 收集检查清单
收集前评估
法律与伦理审查:
✅ Data is publicly available under Swedish Public Access Principle (Offentlighetsprincipen)
✅ Collection method complies with GDPR Article 6(1)(e) - public interest
✅ Data processing aligns with purpose limitation (Article 5(1)(b))
✅ Data retention periods defined and documented
✅ Privacy impact assessment completed for personal data
✅ Source attribution and license compliance verified
来源可靠性评估:
public enum SourceReliability {
A("COMPLETELY_RELIABLE", "Primary government source, official records"),
B("USUALLY_RELIABLE", "Established media, verified aggregators"),
C("FAIRLY_RELIABLE", "Secondary sources with known limitations"),
D("NOT_USUALLY_RELIABLE", "Unverified sources, requires corroboration"),
E("UNRELIABLE", "Known bias, propaganda, unverified claims"),
F("RELIABILITY_CANNOT_BE_JUDGED", "New source, insufficient track record");
private final String description;
private final String criteria;
}
public enum InformationCredibility {
ONE("CONFIRMED", "Verified by multiple independent sources"),
TWO("PROBABLY_TRUE", "Corroborated by additional source"),
THREE("POSSIBLY_TRUE", "Not confirmed but consistent with known facts"),
FOUR("DOUBTFUL", "Contradicts other information"),
FIVE("IMPROBABLE", "Contradicts established facts"),
SIX("TRUTH_CANNOT_BE_JUDGED", "Insufficient information to evaluate");
private final String description;
private final String criteria;
}
数据收集工作流
1. 来源识别
class OSINTSource:
def __init__(self, name, url, api_endpoint=None):
self.name = name
self.url = url
self.api_endpoint = api_endpoint
self.reliability = None # A-F rating
self.credibility = None # 1-6 rating
self.completeness = None
self.last_updated = None
def evaluate_reliability(self):
"""NATO Admiralty Code reliability assessment"""
if self.is_government_official_source():
self.reliability = SourceReliability.A
elif self.is_verified_aggregator():
self.reliability = SourceReliability.B
# ... additional logic
def verify_completeness(self, expected_records, actual_records):
"""Calculate data completeness percentage"""
self.completeness = (actual_records / expected_records) * 100
return self.completeness
def assess_timeliness(self):
"""Calculate data lag from source update to platform availability"""
time_lag = datetime.now() - self.last_updated
return time_lag.total_seconds() / 3600 # Hours
2. 数据采集
@Service
public class OSINTDataCollector {
@Scheduled(cron = "0 0 2 * * *") // Daily at 02:00
public void collectRiksdagenData() {
try {
// 1. Fetch new data
List<VoteData> newVotes = riksdagenClient.getVotesSince(lastCollectionTimestamp);
// 2. Validate data quality
DataQualityReport report = validateDataQuality(newVotes);
if (report.getQualityScore() < 95.0) {
alertService.sendAlert("Low quality data detected", report);
}
// 3. Deduplicate
List<VoteData> uniqueVotes = deduplicateRecords(newVotes);
// 4. Store with audit trail
voteRepository.saveAll(uniqueVotes);
// 5. Update collection metadata
updateCollectionMetrics(uniqueVotes.size(), report);
log.info("Collected {} new votes with {}% quality score",
uniqueVotes.size(), report.getQualityScore());
} catch (Exception e) {
log.error("Data collection failed", e);
alertService.sendAlert("OSINT collection failure", e);
}
}
private DataQualityReport validateDataQuality(List<VoteData> data) {
DataQualityReport report = new DataQualityReport();
// Completeness check
long missingFields = data.stream()
.filter(v -> v.getPersonId() == null || v.getBallotId() == null)
.count();
report.setCompleteness(100.0 - (missingFields * 100.0 / data.size()));
// Consistency check
long invalidVotes = data.stream()
.filter(v -> !Arrays.asList("Ja", "Nej", "Frånvarande", "Avstår").contains(v.getVote()))
.count();
report.setConsistency(100.0 - (invalidVotes * 100.0 / data.size()));
// Temporal validity
long futureVotes = data.stream()
.filter(v -> v.getVoteDate().isAfter(LocalDate.now()))
.count();
report.setTemporalValidity(100.0 - (futureVotes * 100.0 / data.size()));
report.calculateOverallScore();
return report;
}
}
3. 来源交叉验证
-- Cross-Reference Verification: Validate politician data across sources
WITH riksdagen_politicians AS (
SELECT
person_id,
first_name,
last_name,
party,
status
FROM person_data
WHERE status = 'Tjänstgörande riksdagsledamot'
),
riksdagen_seats AS (
SELECT
party,
COUNT(DISTINCT person_id) as active_mps
FROM riksdagen_politicians
GROUP BY party
),
election_seats AS (
SELECT
party_name,
parliament_seats
FROM sweden_political_party
WHERE parliament_seats > 0
)
SELECT
COALESCE(r.party, e.party_name) as party,
r.active_mps as riksdagen_count,
e.parliament_seats as election_authority_count,
ABS(COALESCE(r.active_mps, 0) - COALESCE(e.parliament_seats, 0)) as discrepancy,
CASE
WHEN ABS(COALESCE(r.active_mps, 0) - COALESCE(e.parliament_seats, 0)) = 0 THEN '✅ VERIFIED'
WHEN ABS(COALESCE(r.active_mps, 0) - COALESCE(e.parliament_seats, 0)) <= 2 THEN '⚠️ MINOR_DISCREPANCY'
ELSE '🚨 MAJOR_DISCREPANCY'
END as verification_status
FROM riksdagen_seats r
FULL OUTER JOIN election_seats e ON r.party = e.party_name
ORDER BY discrepancy DESC;
数据质量指标
质量维度
1. 完整性
-- Calculate field completeness across all tables
SELECT
'person_data' as table_name,
COUNT(*) as total_records,
SUM(CASE WHEN first_name IS NULL THEN 1 ELSE 0 END) as missing_first_name,
SUM(CASE WHEN last_name IS NULL THEN 1 ELSE 0 END) as missing_last_name,
SUM(CASE WHEN party IS NULL THEN 1 ELSE 0 END) as missing_party,
ROUND(100.0 * (1.0 - (
SUM(CASE WHEN first_name IS NULL THEN 1 ELSE 0 END)::decimal +
SUM(CASE WHEN last_name IS NULL THEN 1 ELSE 0 END) +
SUM(CASE WHEN party IS NULL THEN 1 ELSE 0 END)
) / (COUNT(*) * 3)), 2) as completeness_percentage
FROM person_data;
2. 准确性
@Component
public class DataAccuracyVerifier {
public AccuracyReport verifyPoliticianData() {
// Manual audit sampling: Verify 100 random politicians against Riksdagen website
List<PersonData> sample = personRepository.findRandomSample(100);
int accurate = 0;
int inaccurate = 0;
for (PersonData person : sample) {
// Fetch from official Riksdagen website for comparison
OfficialPersonData official = riksdagenWebScraper.fetchPersonData(person.getPersonId());
if (verifyMatch(person, official)) {
accurate++;
} else {
inaccurate++;
log.warn("Data mismatch for person_id: {}", person.getPersonId());
}
}
return AccuracyReport.builder()
.sampleSize(sample.size())
.accurateRecords(accurate)
.inaccurateRecords(inaccurate)
.accuracyPercentage((double) accurate / sample.size() * 100)
.build();
}
}
3. 时效性
-- Calculate data freshness lag
SELECT
'vote_data' as data_type,
MAX(created_date) as latest_record,
CURRENT_TIMESTAMP as current_time,
EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - MAX(created_date))) / 3600 as hours_lag,
CASE
WHEN EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - MAX(created_date))) / 3600 < 24 THEN '✅ CURRENT'
WHEN EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - MAX(created_date))) / 3600 < 168 THEN '⚠️ RECENT'
ELSE '🚨 STALE'
END as freshness_status
FROM vote_data;
4. 一致性
-- Detect referential integrity violations
SELECT
'Vote Data Integrity' as check_name,
COUNT(DISTINCT v.ballot_id) as total_votes,
COUNT(DISTINCT CASE WHEN p.person_id IS NULL THEN v.person_id END) as orphaned_person_refs,
COUNT(DISTINCT CASE WHEN b.ballot_id IS NULL THEN v.ballot_id END) as orphaned_ballot_refs,
ROUND(100.0 * (1.0 - (
COUNT(DISTINCT CASE WHEN p.person_id IS NULL THEN v.person_id END)::decimal +
COUNT(DISTINCT CASE WHEN b.ballot_id IS NULL THEN v.ballot_id END)
) / (COUNT(DISTINCT v.ballot_id) * 2)), 2) as consistency_percentage
FROM vote_data v
LEFT JOIN person_data p ON v.person_id = p.person_id
LEFT JOIN ballot_data b ON v.ballot_id = b.ballot_id;
ISMS 合规映射
ISO 27001:2022 控制措施
A.5.10 - 信息的可接受使用
- OSINT 收集仅限于公共利益目的
- 数据使用符合瑞典公共信息公开原则
- 个人数据处理仅限于官方职责范围
A.5.33 - 记录保护
- 为所有收集的数据保留来源归属信息
- 为数据收集活动保留审计跟踪记录
- 保留期限符合相关法律要求
A.8.8 - 技术漏洞管理
- 监控 API 端点的可用性和安全性
- 实施速率限制以防止服务中断
- 安全管理 API 访问凭据
NIST CSF 2.0 职能
识别(ID)
- ID.AM-5:根据分类和业务价值确定资源优先级
- 根据可靠性和完整性对四个 OSINT 来源进行分类
- 持续跟踪数据质量指标
保护(PR)
- PR.DS-5:实施防止数据泄露的保护措施
- 将 API 密钥存储在安全保险库中(AWS Secrets Manager)
- 代码仓库中不存放敏感凭据
检测(DE)
- DE.CM-1:监控网络,以检测潜在的网络安全事件
- 每 5 分钟进行一次 API 健康检查
- 检测异常数据模式
CIS Controls v8.1
CIS Control 3:数据保护
- 3.3:配置数据访问控制列表
- 根据敏感度对 OSINT 数据进行分类
- 根据基于角色的权限实施访问控制
CIS Control 12:网络基础设施管理
- 12.4:拒绝通过未经授权的网络协议进行通信
- 所有 API 通信仅使用 HTTPS
- 对 Riksdagen API 实施证书固定
Hack23 ISMS 政策参考
数据分类政策
- 链接:https://github.com/Hack23/ISMS-PUBLIC/blob/main/Data_Classification_Policy.md
- 应用:OSINT 数据归类为公开(汇总数据)或内部(详细分析数据)
隐私政策
- 链接:https://github.com/Hack23/ISMS-PUBLIC/blob/main/Privacy_Policy.md
- 应用:根据 GDPR 第 6(1)(e) 条,在公共利益基础上处理个人数据
安全开发政策
- 链接:https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md
- 应用:安全的 API 集成模式和凭据管理
第三方管理
- 链接:https://github.com/Hack23/ISMS-PUBLIC/blob/main/Third_Party_Management.md
- 应用:对 API 依赖项(Riksdagen、选举管理局)进行供应商评估
参考资料
官方文档:
- Riksdagen API 文档:https://data.riksdagen.se/dokumentation/
- Valmyndigheten 开放数据:https://www.val.se/serviceapi/
- 世界银行 API:https://datahelpdesk.worldbank.org/knowledgebase/topics/125589
- 瑞典公共信息公开原则:https://www.government.se/how-sweden-is-governed/public-access-to-information-and-secrecy/
CIA 平台文档:
- 情报数据流:INTELLIGENCE_DATA_FLOW.md
- 数据分析框架:DATA_ANALYSIS_INTOP_OSINT.md
- 数据库视图目录:DATABASE_VIEW_INTELLIGENCE_CATALOG.md
- 风险规则:RISK_RULES_INTOP_OSINT.md
学术资料:
- NATO OSINT 手册:情报收集分类
- 用于评估来源可靠性的海军部代码
- GDPR 第 6(1)(e) 条:为执行公共利益任务而进行的必要处理
标准:
- ISO 27001:2022:信息安全管理
- NIST 特别出版物 800-53:安全与隐私控制
- CIS Controls v8.1:关键安全控制
🔗 与 Agentic 工作流和分析产物集成
此技能由 .github/workflows/news-*.md 中的 11 个 Agentic 新闻工作流使用。权威规范见 .github/prompts/README.md;此技能在该规范基础上提供领域专业知识。
- 分析成果 →
ai-driven-analysis-guide.md+analysis/templates/中的所有模板。 - 分析任何文章前的必需项:在
analysis/daily/$ARTICLE_DATE/$SUBFOLDER/中准备 9 份核心产物(Tier-C 为 14 份);05-analysis-gate.md是唯一的阻断关卡。 - gh-aw v0.69.3 文档:精简版 · 完整版 · 博客系列。
🌐 IMF 作为主要经济来源(OSINT 来源评估更新)
生效日期: 2026-04-24
经济来源的海军部代码评级
| 来源 | 可靠性(A–E) | 可信度(1–6) | 用途 |
|---|---|---|---|
| IMF WEO / Fiscal Monitor | A(始终可靠) | 1(经其他来源证实) | 主要来源 — 宏观、财政、货币、外部、预测 |
| IMF IFS / BOP / DOTS / GFS_COFOG / PCPS / ER / MFS | A | 2(可能属实) | 主要来源 — 高频经济指标 |
| SCB(瑞典统计局) | A | 1 | 主要来源 — 瑞典特定领域的基准事实 |
| Riksbank | A | 1 | 货币政策的辅助来源 |
| 世界银行 WGI(仅限治理) | A | 1 | 治理领域的主要来源(CC.EST、RL.EST、VA.EST、GE.EST、RQ.EST、PV.EST) |
| 世界银行 WDI / WGI(非经济背景) | A | 1 | 治理(*.EST)、环境(EN.*、EG.*、AG.LND.FRST.ZS)、社会/教育剩余指标(SP.*、SH.*、SE.*)、历史国防数据(MS.MIL.*)、犯罪(VC.IHR.PSRC.P5)领域的主要来源 |
**OSINT 通用规则:**在经济情报领域(宏观、财政、货币、外部、贸易、商品、外汇、利率),IMF 评级为 A1/A2,是所有经济主张的数据来源。世界银行在 analysis/worldbank/indicators-inventory.json 中列出的治理、环境、社会/教育、历史国防以及犯罪/司法背景领域评级为 A1。请参阅 .github/aw/ECONOMIC_DATA_CONTRACT.md v3.0 和 analysis/imf/。