MoonBit-native data retention capsule planner
moon add SHX-ai-nb/capsuletrace-uploadSHX-ai-nb/capsuletrace-uploadfn main {
let plan = @capsuletrace.sample_plan()
println(plan.to_markdown())
}moon run cmd/mainmoon run cmd/auditlet rule = @capsuletrace.retention_rule(
"analytics.behavior",
"analytics",
"behavior",
180,
30,
true,
["eu", "cn", "us"],
false,
"privacy-analytics",
"aggregate behavior capsules after short-term product analysis",
)let capsule = @capsuletrace.data_capsule(
"cap.active-analytics",
"visitor",
"analytics",
"behavior",
200,
216,
@capsuletrace.ConsentGranted,
@capsuletrace.SensitiveData,
"cn",
true,
@capsuletrace.InternalOnly,
"active product telemetry capsule",
)let decision = @capsuletrace.evaluate_capsule(capsule, [rule], 220)
let plan = @capsuletrace.plan_retention([capsule], [rule], 220)let report = @capsuletrace.analyze_purpose_drift(
@capsuletrace.sample_use_events(),
@capsuletrace.sample_capsules(),
@capsuletrace.sample_purpose_rules(),
225,
)
println(report.to_markdown())allow | require-reconsent | escalate | blockday: 220
rule: analytics.behavior | analytics | behavior | 180 | 30 | consent | eu,cn,us | internal-only | privacy-analytics | Aggregate visitor behavior quickly.
capsule: cap.active-analytics | visitor | analytics | behavior | 200 | 216 | granted | sensitive | cn | encrypted | internal | Active telemetry.moon fmt --check
moon check --deny-warn
moon build
moon test --deny-warn
moon run cmd/main
moon run cmd/audit
moon publish --dry-runmoon fmt --check: passed
moon check --deny-warn: passed
moon build: passed
moon test --deny-warn: 36 passed, 0 failed
moon run cmd/main: passed
moon run cmd/audit: passed
moon package: passed
effective MoonBit LOC: 3,861moon publish --frozenhttps://mooncakes.io/docs/SHX-ai-nb/capsuletrace-upload
https://mooncakes.io/api/v0/manifest/SHX-ai-nb/capsuletrace-uploadpub(all) struct CapsuleDecision {
capsule : DataCapsule
rule_id : String
action : RetentionAction
severity : RetentionSeverity
age_days : Int
idle_days : Int
days_until_delete : Int
reasons : Array[RetentionReason]
owner : String
} derive(Eq, Debug)pub(all) struct CapsuleUseEvent {
id : String
capsule_id : String
day : Int
use_purpose : String
actor : String
region : String
sharing : SharingMode
note : String
} derive(Eq, Debug)pub(all) struct CatalogFinding {
kind : CatalogFindingKind
severity : RetentionSeverity
subject : String
message : String
remedy : String
} derive(Eq, Debug)pub(all) struct CatalogReport {
rules : Array[RetentionRule]
capsules : Array[DataCapsule]
findings : Array[CatalogFinding]
covered_capsules : Int
uncovered_capsules : Int
} derive(Eq, Debug)fn CatalogReport::findings_for_subject(self : CatalogReport, subject : StringView) -> Array[CatalogFinding]pub(all) struct DataCapsule {
id : String
subject_kind : String
purpose : String
data_kind : String
collected_day : Int
last_used_day : Int
consent : ConsentState
sensitivity : CapsuleSensitivity
region : String
encrypted : Bool
sharing : SharingMode
note : String
} derive(Eq, Debug)pub(all) struct OperatorPlaybook {
generated_day : Int
tasks : Array[OperatorTask]
} derive(Eq, Debug)fn OperatorPlaybook::mark_blocked(self : OperatorPlaybook, task_id : StringView) -> OperatorPlaybookfn OperatorPlaybook::tasks_for_owner(self : OperatorPlaybook, owner : StringView) -> Array[OperatorTask]pub(all) struct OperatorTask {
id : String
owner : String
action : RetentionAction
severity : RetentionSeverity
due_day : Int
capsule_ids : Array[String]
reason_kinds : Array[String]
checklist : Array[String]
status : OperatorTaskStatus
} derive(Eq, Debug)pub(all) struct PlanShift {
capsule_id : String
kind : PlanShiftKind
impact : PlanShiftImpact
before_action : String
after_action : String
before_severity : String
after_severity : String
message : String
} derive(Eq, Debug)pub(all) struct PurposeDriftReport {
generated_day : Int
decisions : Array[UseDecision]
total_events : Int
allowed_count : Int
reconsent_count : Int
blocked_count : Int
escalated_count : Int
} derive(Eq, Debug)fn PurposeDriftReport::decisions_for_action(self : PurposeDriftReport, action : UseAction) -> Array[UseDecision]pub(all) struct RetentionCalendar {
generated_day : Int
windows : Array[RetentionWindow]
} derive(Eq, Debug)pub(all) struct RetentionManifest {
today : Int
rules : Array[RetentionRule]
capsules : Array[DataCapsule]
issues : Array[RetentionParseIssue]
} derive(Eq, Debug)pub(all) struct RetentionPlan {
generated_day : Int
decisions : Array[CapsuleDecision]
rules : Array[RetentionRule]
summary : PlanSummary
} derive(Eq, Debug)pub(all) struct RetentionReason {
kind : RetentionIssueKind
severity : RetentionSeverity
message : String
remedy : String
} derive(Eq, Debug)pub(all) struct RetentionWindow {
day : Int
action : RetentionAction
capsule_ids : Array[String]
} derive(Eq, Debug)pub(all) struct UseDecision {
event : CapsuleUseEvent
capsule_id : String
rule_id : String
action : UseAction
severity : RetentionSeverity
issues : Array[UseIssue]
owner : String
} derive(Eq, Debug)pub(all) struct UseIssue {
kind : UseIssueKind
severity : RetentionSeverity
message : String
remedy : String
} derive(Eq, Debug)fn analyze_purpose_drift(events : Array[CapsuleUseEvent], capsules : Array[DataCapsule], rules : Array[PurposeRule], today : Int) -> PurposeDriftReportfn capsule_use_event(id : String, capsule_id : String, day : Int, use_purpose : String, actor : String, region : String, sharing : SharingMode, note : String) -> CapsuleUseEventfn data_capsule(id : String, subject_kind : String, purpose : String, data_kind : String, collected_day : Int, last_used_day : Int, consent : ConsentState, sensitivity : CapsuleSensitivity, region : String, encrypted : Bool, sharing : SharingMode, note : String) -> DataCapsulefn evaluate_capsule(capsule : DataCapsule, rules : Array[RetentionRule], today : Int) -> CapsuleDecisionfn evaluate_use_event(event : CapsuleUseEvent, capsules : Array[DataCapsule], rules : Array[PurposeRule]) -> UseDecisionfn plan_retention(capsules : Array[DataCapsule], rules : Array[RetentionRule], today : Int) -> RetentionPlanfn purpose_rule(id : String, source_purpose : String, allowed_use_purposes : Array[String], allowed_actors : Array[String], allowed_regions : Array[String], allow_processor : Bool, allow_public : Bool, requires_fresh_consent : Bool, owner : String, note : String) -> PurposeRulefn retention_rule(id : String, purpose : String, data_kind : String, max_keep_days : Int, anonymize_after_days : Int, requires_consent : Bool, allowed_regions : Array[String], allow_external_sharing : Bool, owner : String, note : String) -> RetentionRuleMoonBit-native data retention capsule planner