mcpField
O
osint-methodologies

osint-methodologies

github.com/hack23数据与数据库1346 次安装今天更新
代码仓库

关于 osint-methodologies

面向 Riksdagsmonitor 的 OSINT 方法技能,供收集瑞典政治公开信息的团队使用。内容涵盖来源评估、交叉核验、数据质量以及法律与隐私保障。

主要功能

  1. 01四类公开数据源框架
  2. 02来源可靠性与完整性评估
  3. 03跨来源核验方法
  4. 04数据新鲜度与准确性检查
  5. 05GDPR 与隐私审查指引

适用场景

  1. 01规划政治公开数据采集
  2. 02检查来源可靠性与覆盖度
  3. 03跨独立来源核验记录
  4. 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()
        );
    }
}

数据类别:

  1. 投票记录(vote_data 表)

    • 选票上的个人投票
    • 党纪指标
    • 联盟投票模式
    • 投票趋势的时间变化
  2. 文档(document_element、document_status_container)

    • 立法提案(motioner)
    • 政府法案(propositioner)
    • 委员会报告(utskottsbetänkanden)
    • 议会质询(interpellationer)
  3. 政治人物(person_data、assignment_data)

    • 议会职务和任命
    • 委员会成员身份
    • 党派归属
    • 职业轨迹
  4. 议会活动

    • 辩论参与情况
    • 委员会工作
    • 政府质询
    • 发言时间

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 政策参考

数据分类政策

隐私政策

安全开发政策

第三方管理

参考资料

官方文档:

CIA 平台文档:

学术资料:

  • 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;此技能在该规范基础上提供领域专业知识。


🌐 IMF 作为主要经济来源(OSINT 来源评估更新)

生效日期: 2026-04-24

经济来源的海军部代码评级
来源可靠性(A–E)可信度(1–6)用途
IMF WEO / Fiscal MonitorA(始终可靠)1(经其他来源证实)主要来源 — 宏观、财政、货币、外部、预测
IMF IFS / BOP / DOTS / GFS_COFOG / PCPS / ER / MFSA2(可能属实)主要来源 — 高频经济指标
SCB(瑞典统计局)A1主要来源 — 瑞典特定领域的基准事实
RiksbankA1货币政策的辅助来源
世界银行 WGI(仅限治理)A1治理领域的主要来源(CC.EST、RL.EST、VA.EST、GE.EST、RQ.EST、PV.EST)
世界银行 WDI / WGI(非经济背景)A1治理(*.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/。

评论

支持 Markdown