154 lines
4.9 KiB
JSON
154 lines
4.9 KiB
JSON
{
|
|
"planPath": "archreview/plans/R3-02-stale-good-family-plan.md",
|
|
"lastUpdated": "2026-08-20",
|
|
"tasks": [
|
|
{
|
|
"id": "T1",
|
|
"subject": "InputQuality.WorstOf shared helper (Core.Abstractions) + truth-table tests; re-point ScriptedAlarmEngine.WorstInputStatus",
|
|
"status": "done",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": "T2",
|
|
"subject": "MQTT plain-mode initial push of cached snapshots on SubscribeAsync — push-model forceRaise (05/STAB-18 shape b)",
|
|
"status": "done",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": "T3",
|
|
"subject": "MqttConnection.ConnectionLost event + plain-mode stale observed refs to BadNoCommunication (value retained) so the identical replay recovers (05/STAB-18 shape a)",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T2"
|
|
]
|
|
},
|
|
{
|
|
"id": "T4",
|
|
"subject": "SparkplugIngestor: initial push on subscribe + connection-loss stale; rewrite the 'values are deliberately not staled' remark",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T3"
|
|
]
|
|
},
|
|
{
|
|
"id": "T5",
|
|
"subject": "MQTT driver-level end-to-end recovery test (broker drop -> Bad -> identical retained replay -> Good) + docs/drivers/Mqtt.md section",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T4"
|
|
]
|
|
},
|
|
{
|
|
"id": "T6",
|
|
"subject": "IOpcUaAddressSpaceSink.WriteStatuses (StatusWrite, default impl) + OtOpcUaNodeManager status-only batch retaining value + SdkAddressSpaceSink/DeferredAddressSpaceSink forwards (03/S15)",
|
|
"status": "done",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": "T7",
|
|
"subject": "OpcUaPublishActor.AttributeStatusBatchUpdate handler -> sink.WriteStatuses (metered, partial-failure Warning)",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T6"
|
|
]
|
|
},
|
|
{
|
|
"id": "T8",
|
|
"subject": "DriverHostActor.FanCommsLossToValueNodes: one BadNoCommunication status batch over raw + UNS nodes on ConnectivityChanged(false); nothing on reconnect (new method — R3-03 boundary)",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T7"
|
|
]
|
|
},
|
|
{
|
|
"id": "T9",
|
|
"subject": "Recovery audit: _commsLatched per driver, pruned by routed values, CommsRecoveryAudit timer + otopcua.driver.comms_latched_refs meter (dedup-trap tripwire)",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T8"
|
|
]
|
|
},
|
|
{
|
|
"id": "T10",
|
|
"subject": "S15 end-to-end recovery contract test: real DriverInstanceActor + scripted fake with IDENTICAL-value initial push; silent-resubscribe falsification control",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T9"
|
|
]
|
|
},
|
|
{
|
|
"id": "T11",
|
|
"subject": "DriverInstanceActor.PostStop Tells ConnectivityChanged(false) so operator restart / respawn latches nodes Bad (land after R3-03 merges)",
|
|
"status": "pending",
|
|
"blockedBy": [
|
|
"T8"
|
|
]
|
|
},
|
|
{
|
|
"id": "T12",
|
|
"subject": "DependencyConsumerMuxAdapter forwards the real StatusCode; delete the false 'quality is stripped' comment (05/STAB-19)",
|
|
"status": "done",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": "T13",
|
|
"subject": "CalculationDriver input quality: snapshots per dep, hold on Bad, publish worst-of-input once per status change, status-keyed dedup bypass on recovery, ReadOne parity",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T1",
|
|
"T12"
|
|
]
|
|
},
|
|
{
|
|
"id": "T14",
|
|
"subject": "CalculationEvaluator snapshot overload: read cache carries real input status + timestamps; passthrough fast path on snapshots",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T13"
|
|
]
|
|
},
|
|
{
|
|
"id": "T15",
|
|
"subject": "IVirtualTagEvaluator snapshot overload (default-implemented) + RoslynVirtualTagEvaluator.BuildReadCache pass-through (02/S14)",
|
|
"status": "done",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": "T16",
|
|
"subject": "VirtualTagActor honours input quality: snapshot map, hold on Bad, worst-of status, (value,status) dedup key, reassert carries status; host-bridge historize parity test",
|
|
"status": "done",
|
|
"blockedBy": [
|
|
"T1",
|
|
"T15"
|
|
]
|
|
},
|
|
{
|
|
"id": "T17",
|
|
"subject": "Docs: the quality contract stated once (DriverLifecycle.md) + Raw/Uns/ScriptEditor/Calculation pointers + CLAUDE.md bullet",
|
|
"status": "pending",
|
|
"blockedBy": []
|
|
},
|
|
{
|
|
"id": "T18",
|
|
"subject": "Full-suite sweep (Runtime.Tests 3x for the #500 flake profile) + STATUS.md / source-report bookkeeping",
|
|
"status": "pending",
|
|
"blockedBy": [
|
|
"T5",
|
|
"T10",
|
|
"T11",
|
|
"T14",
|
|
"T16",
|
|
"T17"
|
|
]
|
|
},
|
|
{
|
|
"id": "T19",
|
|
"subject": "LIVE GATE: docker-dev comms-loss -> identical-value recovery (Modbus constant HR[5] raw+UNS, calc, VT, deadband falsification leg, restart leg, MQTT retained replay)",
|
|
"status": "pending",
|
|
"blockedBy": [
|
|
"T18"
|
|
]
|
|
}
|
|
]
|
|
}
|