원클릭으로
cia-data-integration
Citizen Intelligence Agency data model integration, riksdag data processing, political entity mapping
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Citizen Intelligence Agency data model integration, riksdag data processing, political entity mapping
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Identity and access management: RBAC, least privilege, MFA, quarterly reviews per ISO 27001 A.5.15, A.8.2, A.8.3
Business continuity and disaster recovery: 30-day retention, quarterly restore tests, RTO/RPO targets per ISO 27001 A.17
Political psychology, cognitive biases, group dynamics, leadership analysis, decision-making patterns for Swedish political intelligence
Risk-based data and asset classification framework: PUBLIC, INTERNAL, CONFIDENTIAL, RESTRICTED aligned with ISO 27001 A.5.12 and CIA triad
Unified compliance verification across ISO 27001, NIST CSF, CIS Controls, NIS2, EU CRA, GDPR, SOC 2, PCI DSS, and HIPAA for cybersecurity consulting
Cryptographic controls implementation: TLS 1.3, AES-256-GCM, bcrypt, RSA-4096, key management per NIST FIPS 140-2 and ISO 27001 A.8.24
| name | cia-data-integration |
| description | Citizen Intelligence Agency data model integration, riksdag data processing, political entity mapping |
| license | Apache-2.0 |
Guide the integration of Swedish political data into the CIA platform's data model, covering entity mapping, data transformation, and consistency rules for Riksdagen, election, and financial data sources.
Do NOT use for:
┌──────────────────────────────────────────────────────┐
│ External Data Sources │
├──────────────┬────────────┬──────────┬───────────────┤
│ Riksdagen │ Val.se │ World │ ESV │
│ Open Data │ Elections │ Bank │ Finances │
└──────┬───────┴─────┬──────┴────┬─────┴───────┬───────┘
│ │ │ │
▼ ▼ ▼ ▼
┌──────────────────────────────────────────────────────┐
│ Service Layer (Spring) │
│ service.external.riksdagen │
│ service.external.val │
│ service.external.worldbank │
│ service.external.esv │
└──────────────────────┬───────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ Internal Data Model (JPA) │
│ model.internal.application.data │
│ ├── Politicians ├── Committees │
│ ├── Votes ├── Documents │
│ ├── Parties ├── Elections │
│ └── Risk Scores └── Financial Data │
└──────────────────────────────────────────────────────┘
| Module | Purpose |
|---|---|
model.external.riksdagen | API models for Riksdagen data |
model.external.riksdagen.person.impl | Person/politician data mapping |
model.external.riksdagen.votering.impl | Voting record processing |
model.external.riksdagen.dokumentstatus.impl | Document metadata |
model.external.val.partier.impl | Political party data |
model.internal.application.data.impl | Internal aggregated model |
@Entity
@Table(name = "person_data")
public class PersonData implements Serializable {
@Id
@Column(name = "id")
private String id; // Riksdagen person ID (intressent_id)
@Column(name = "first_name")
private String firstName; // förnamn
@Column(name = "last_name")
private String lastName; // efternamn
@Column(name = "party")
private String party; // parti
@Column(name = "born_year")
private int bornYear; // född_ar
@Column(name = "gender")
private String gender; // kön
@Column(name = "status")
private String status; // status (Tjänstgörande, etc.)
}
@Entity
@Table(name = "vote_data")
public class VoteData implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "intressent_id")
private String intressentId; // Links to PersonData
@Column(name = "rm")
private String riksmote; // Parliamentary session (e.g., "2023/24")
@Column(name = "beteckning")
private String designation; // Vote designation
@Column(name = "rost")
private String vote; // Ja/Nej/Avstår/Frånvarande
@Column(name = "votering_id")
private String voteringId; // Unique voting session ID
}
public class DataQualityValidator {
// Valid Swedish Parliament parties
private static final Set<String> VALID_PARTIES = Set.of(
"S", "M", "SD", "C", "V", "KD", "L", "MP", "-"
);
// Valid vote values from Riksdagen
private static final Set<String> VALID_VOTES = Set.of(
"Ja", "Nej", "Avstår", "Frånvarande"
);
public void validatePersonData(PersonData person) {
Objects.requireNonNull(person.getId(), "Person ID is required");
if (!VALID_PARTIES.contains(person.getParty())) {
LOG.warn("Unknown party code: {} for person: {}",
person.getParty(), person.getId());
}
}
public void validateVoteData(VoteData vote) {
Objects.requireNonNull(vote.getIntressentId(), "Intressent ID is required");
if (!VALID_VOTES.contains(vote.getVote())) {
throw new DataValidationException(
"Invalid vote value: " + vote.getVote());
}
}
}
| Data Type | Maximum Age | Refresh Frequency |
|---|---|---|
| Person list | 24 hours | Daily at 02:00 |
| Voting records | 1 hour | During Riksdag sessions |
| Documents | 6 hours | 4 times daily |
| Committee data | 24 hours | Daily |
| Election results | 30 days | Post-election only |
GET /personlista/?iid={id}&utformat=json → Person details
GET /voteringlista/?rm={session}&utformat=json → Voting list
GET /dokumentlista/?sok={query}&utformat=json → Document search
GET /dokumentstatus/{doc_id}.json → Document status
@Service
public class RiksdagDataImportService {
@Transactional
public ImportResult importPersonData() {
// 1. Fetch from Riksdagen API
PersonLista personList = riksdagClient.getPersonLista();
// 2. Validate each record
List<PersonData> validated = personList.getPersons().stream()
.filter(this::isValid)
.map(this::mapToInternal)
.collect(Collectors.toList());
// 3. Upsert into database
int updated = personRepository.batchUpsert(validated);
// 4. Log import metrics
return new ImportResult(validated.size(), updated);
}
}
| Control | Requirement |
|---|---|
| ISO 27001 A.8.11 | Data masking for sensitive fields |
| ISO 27001 A.5.33 | Protection of records |
| NIST CSF PR.DS-1 | Data-at-rest protection |
| CIS Control 3 | Data protection |