This version of the module is deprecated: Renamed to lllg123/ContinuityForge
A MoonBit library for validated resource-constrained project scheduling
| 约束或能力 | v2 状态 |
|---|---|
| 单模式、固定整数工期、非抢占任务与 DAG 依赖 | 支持;零时长仅供无需求虚拟里程碑 |
| 多类可再生资源、正整数容量与任务同时占用 | 支持;区间为 [start, finish) |
| 最早开工、可选硬截止、可选总体目标 Makespan | 支持;整数溢出与非法输入拒绝 |
| 独立排程验证、结构化违规、FEASIBLE/UNKNOWN | 支持;无解/最优证明由独立求解器或官方基准提供 |
| 多执行模式、抢占、不可再生资源、动态容量、人员日历和随机工期 | 当前不支持 |
ContinuityForge/
├── core.mbt # MoonBit 核心包入口与集成探针
├── model.mbt # 服务、组件和依赖领域模型
├── dependency.mbt # 拓扑排序与循环依赖校验
├── bia.mbt # RTO、RPO、最大中断时间与影响等级
├── impact.mbt # 故障影响传播与稳定路径
├── recovery.mbt # 依赖约束、影响等级和资源窗口下的恢复排序
├── scheduling/ # 旧单资源 API 与 v2 多资源 RCPSP 库、独立验证器
├── adapters/ # 故障恢复与 CI 流水线到通用调度问题的映射
├── benchmark/ # 合成实验、PSPLIB 转换、CP-SAT 参照与原始实验产物
├── cmd/rcpsp/ # v2 JSON 到 MoonBit JavaScript 的命令边界
├── playbook.mbt # 恢复步骤、前置条件与人工审批状态机
├── drill.mbt # 演练状态与有序审计时间线
├── api.mbt # 统一暴露经过校验的领域操作
├── storage.mbt # 项目与审计记录的持久化快照
├── auth.mbt # 本地用户、角色与权限校验
├── web/
│ ├── index.html # 库存、BIA、故障、恢复与演练工作区页面
│ ├── styles.css # 工作区视觉样式
│ ├── app.js # 本地交互、MoonBit 引擎调用、证据导出与浏览器存储
│ ├── engine/ # 浏览器用 MoonBit JSON 边界
│ └── engine.mjs # 编译并发布的 MoonBit ESM
├── server/ # API、权限、持久化和输入校验
├── docs/
│ ├── operations.md # 安装、运行、操作和发布检查
│ └── recovery-scheduling.md # 恢复窗口算法、下界与案例
├── examples/
│ ├── minimal/ # 可运行的领域闭环示例与脱敏输入
│ ├── recovery_window/ # 资源独占、并行和恢复窗口案例
│ ├── ci_pipeline/ # 旧版三个 Runner 排程
│ └── rcpsp/ # v2 CI、故障恢复、项目及各自失败案例
└── integration/ # 跨语言构建与集成验证moon version --all
node --versionpython --versiongit clone https://github.com/lllg123/ContinuityForge.git
cd ContinuityForgemoon add lllg123/continuity_forge@0.1.0moon build cmd/rcpsp --target js --release --deny-warn
node integration/js/rcpsp-cli.mjs examples/rcpsp/ci.json
node examples/rcpsp/check.mjspython -m pip install -r benchmark/reference/requirements.txt
python benchmark/reference/ortools_rcpsp.py examples/rcpsp/ci.jsonmoon run examples/minimalpython -m http.server 8765 --directory webmoon fmt
moon check --deny-warn
moon build --target js --deny-warn
node integration/js/smoke.mjs
moon build cmd/rcpsp --target js --release --deny-warn
node examples/rcpsp/check.mjsmoon fmt
moon check --target all --deny-warn
moon test --target all
moon build --target all --deny-warn
moon run examples/minimal
moon run examples/recovery_window
moon run examples/ci_pipeline
moon build cmd/rcpsp --target js --release --deny-warn
node examples/rcpsp/check.mjs
node --check benchmark/rcpsp/run.mjs
python benchmark/reference/check_scenarios.py
node integration/js/smoke.mjs
node --check web/app.js
git diff --checkpub(all) suberror ModelError {
EmptyField(String)
SelfDependency(String)
DuplicateAsset(String)
MissingAsset(String)
DuplicateDependency(String)
DependencyCycle(String)
InvalidImpactScore(String)
InvalidDuration(String)
InvalidBia(String)
RecoveryResourceConflict(String)
RecoveryTargetUnmet(String)
PlaybookValidation(String)
StepNotFound(String)
StepBlocked(String)
InvalidStepTransition(String)
DrillValidation(String)
InvalidDrillTransition(String)
StorageValidation(String)
ProjectNotFound(String)
DuplicateAuditRecord(String)
DuplicateUser(String)
UserNotFound(String)
AccessDenied(String)
}pub(all) enum AuditAction {
DrillStarted
StepStarted
StepApproved
StepCompleted
DrillFinished
}pub(all) struct AuditEvent {
sequence : Int
timestamp_minutes : Int
actor : String
action : AuditAction
step_id : String?
}fn AuditEvent::new(sequence~ : Int, timestamp_minutes~ : Int, actor~ : String, action~ : AuditAction, step_id~ : String?) -> AuditEvent raise ModelErrorfn AuditRecord::new(id~ : String, project_id~ : String, event~ : AuditEvent) -> AuditRecord raise ModelErrorpub(all) struct BusinessImpactAssessment {
service_id : ServiceId
impact_score : Int
impact_level : ImpactLevel
rto : TimeSpan
rpo : TimeSpan
max_tolerable_downtime : TimeSpan
}fn BusinessImpactAssessment::new(service_id~ : ServiceId, impact_score~ : Int, rto~ : TimeSpan, rpo~ : TimeSpan, max_tolerable_downtime~ : TimeSpan) -> BusinessImpactAssessment raise ModelErrorfn BusinessService::new(id~ : ServiceId, name~ : String, owner~ : String) -> BusinessService raise ModelErrorpub(all) struct ComponentId {
value : String
}fn ContinuityStorage::append_audit(self : ContinuityStorage, record~ : AuditRecord) -> ContinuityStorage raise ModelErrorfn ContinuityStorage::audit_timeline(self : ContinuityStorage, project_id~ : String) -> Array[AuditRecord] raise ModelErrorfn ContinuityStorage::save_project(self : ContinuityStorage, project~ : Project) -> ContinuityStorage raise ModelErrorpub(all) enum DrillStatus {
Planned
Running
Completed
}pub(all) struct IncidentImpact {
failed_asset : AssetRef
affected : Array[AssetRef]
paths : Array[ImpactPath]
}fn LocalAuthStore::activate_user(self : LocalAuthStore, user_id~ : String) -> LocalAuthStore raise ModelErrorfn LocalAuthStore::authorize(self : LocalAuthStore, user_id~ : String, permission~ : Permission) -> Unit raise ModelErrorfn LocalAuthStore::deactivate_user(self : LocalAuthStore, user_id~ : String) -> LocalAuthStore raise ModelErrorfn LocalAuthStore::register_user(self : LocalAuthStore, user~ : LocalUser) -> LocalAuthStore raise ModelErrorpub(all) enum Permission {
ReadProjects
ReadAudit
RunDrills
ApproveRecovery
ManageUsers
}pub(all) enum PlaybookStatus {
Draft
Active
Completed
}pub(all) struct Project {
id : String
name : String
owner : String
}fn RecoveryConstraints::new(target_window~ : TimeSpan, available_resources~ : Array[String]) -> RecoveryConstraints raise ModelErrorpub(all) struct RecoveryDrill {
id : String
playbook : RecoveryPlaybook
status : DrillStatus
timeline : Array[AuditEvent]
}fn RecoveryDrill::approve_step(self : RecoveryDrill, step_id~ : String, actor~ : String, timestamp_minutes~ : Int) -> RecoveryDrill raise ModelErrorfn RecoveryDrill::begin_step(self : RecoveryDrill, step_id~ : String, actor~ : String, timestamp_minutes~ : Int) -> RecoveryDrill raise ModelErrorfn RecoveryDrill::complete_step(self : RecoveryDrill, step_id~ : String, actor~ : String, timestamp_minutes~ : Int) -> RecoveryDrill raise ModelErrorfn RecoveryDrill::finish(self : RecoveryDrill, actor~ : String, timestamp_minutes~ : Int) -> RecoveryDrill raise ModelErrorfn RecoveryDrill::start(self : RecoveryDrill, actor~ : String, timestamp_minutes~ : Int) -> RecoveryDrill raise ModelErrorpub(all) struct RecoveryItem {
asset : AssetRef
impact_level : ImpactLevel
recovery_time : TimeSpan
resource : String
}fn RecoveryItem::new(asset~ : AssetRef, impact_level~ : ImpactLevel, recovery_time~ : TimeSpan, resource~ : String) -> RecoveryItem raise ModelErrorpub(all) struct RecoveryPlan {
ordered : Array[RecoveryItem]
schedule : Array[RecoveryScheduleEntry]
total_time_minutes : Int
target_window_minutes : Int
dependency_lower_bound_minutes : Int
resource_lower_bound_minutes : Int
slack_minutes : Int
}fn RecoveryPlaybook::approve_step(self : RecoveryPlaybook, step_id~ : String) -> RecoveryPlaybook raise ModelErrorfn RecoveryPlaybook::begin_step(self : RecoveryPlaybook, step_id~ : String) -> RecoveryPlaybook raise ModelErrorfn RecoveryPlaybook::complete_step(self : RecoveryPlaybook, step_id~ : String) -> RecoveryPlaybook raise ModelErrorfn RecoveryPlaybook::new(id~ : String, steps~ : Array[RecoveryStep]) -> RecoveryPlaybook raise ModelErrorpub(all) struct RecoveryStep {
id : String
asset : AssetRef
owner : String
requires_approval : Bool
prerequisites : Array[String]
status : StepStatus
}fn RecoveryStep::new(id~ : String, asset~ : AssetRef, owner~ : String, requires_approval~ : Bool, prerequisites~ : Array[String]) -> RecoveryStep raise ModelErrorpub(all) enum Role {
Viewer
Operator
Approver
Administrator
}pub(all) struct ServiceId {
value : String
}pub(all) enum StepStatus {
Pending
AwaitingApproval
InProgress
Succeeded
}fn TechnicalComponent::new(id~ : ComponentId, name~ : String, technology~ : String) -> TechnicalComponent raise ModelErrorpub(all) enum TimeUnit {
Minutes
Hours
Days
}fn assess_business_impact(service_id~ : ServiceId, impact_score~ : Int, rto~ : TimeSpan, rpo~ : TimeSpan, max_tolerable_downtime~ : TimeSpan) -> BusinessImpactAssessment raise ModelErrorfn create_recovery_step(id~ : String, asset~ : AssetRef, owner~ : String, requires_approval~ : Bool, prerequisites~ : Array[String]) -> RecoveryStep raise ModelErrorfn dependency_order(assets : Array[AssetRef], dependencies : Array[Dependency]) -> Array[AssetRef] raise ModelErrorfn integration_probe() -> Stringfn order_dependencies(assets~ : Array[AssetRef], dependencies~ : Array[Dependency]) -> Array[AssetRef] raise ModelErrorfn plan_recovery(items~ : Array[RecoveryItem], dependencies~ : Array[Dependency], constraints~ : RecoveryConstraints) -> RecoveryPlan raise ModelErrorfn prioritize_recovery(items~ : Array[RecoveryItem], dependencies~ : Array[Dependency], constraints~ : RecoveryConstraints) -> RecoveryPlan raise ModelErrorfn register_component(id~ : ComponentId, name~ : String, technology~ : String) -> TechnicalComponent raise ModelErrorfn register_service(id~ : ServiceId, name~ : String, owner~ : String) -> BusinessService raise ModelErrorfn simulate_impact(failed_asset~ : AssetRef, assets~ : Array[AssetRef], dependencies~ : Array[Dependency]) -> IncidentImpact raise ModelErrorfn simulate_incident_impact(failed_asset~ : AssetRef, assets~ : Array[AssetRef], dependencies~ : Array[Dependency]) -> IncidentImpact raise ModelErrorfn validate_dependencies(assets~ : Array[AssetRef], dependencies~ : Array[Dependency]) -> Unit raise ModelErrorfn validate_dependency_graph(assets : Array[AssetRef], dependencies : Array[Dependency]) -> Unit raise ModelErrorInstall
Download zipA MoonBit library for validated resource-constrained project scheduling