Joseph Doherty
84fdea60cf
merge(r2): r2-plan05
2026-07-13 11:08:27 -04:00
Joseph Doherty
3ad5ad0d7e
merge(r2): r2-plan03
2026-07-13 11:08:27 -04:00
Joseph Doherty
774e3918db
merge(r2): PLAN-R2-07 UI/Management/Security
2026-07-13 11:08:10 -04:00
Joseph Doherty
2751a6dba9
test(management): freeze scrubber fragment coverage over DataConnection config types + document array-merge limit (plan R2-07 T12)
2026-07-13 11:05:19 -04:00
Joseph Doherty
1b88ca1296
fix(security): amortize LoginThrottle.Prune off the failed-bind hot path (plan R2-07 T11)
2026-07-13 11:03:26 -04:00
Joseph Doherty
5b16429635
fix(sitestream): deathwatch resets live-cache liveness on aggregator termination (plan R2-07 T10)
2026-07-13 11:01:54 -04:00
Joseph Doherty
56d39b5fce
fix(host): site singletons (deployment-manager, event-log-handler) via SingletonRegistrar — PhaseClusterLeave drains for site SQLite writes (plan R2-01 T11)
2026-07-13 11:01:44 -04:00
Joseph Doherty
76ef97f729
fix(ui): disposal guard on Alarm Summary live callback, matching the DebugView pattern (plan R2-07 T9)
2026-07-13 10:58:50 -04:00
Joseph Doherty
925c869826
fix(ui): Alarm Summary poll defers row rebuilds to the live path while IsLive (plan R2-07 T8)
2026-07-13 10:57:09 -04:00
Joseph Doherty
d33337a834
fix(ui): drop stale-site poll results on Alarm Summary site switch (plan R2-07 T7)
2026-07-13 10:55:25 -04:00
Joseph Doherty
1fcfa4fb16
fix(security): scope-filter secured-write listing + align spec with enforced site scoping (plan R2-07 T6)
2026-07-13 10:53:16 -04:00
Joseph Doherty
80e5b36852
refactor(host): CentralSingletonRegistrar -> SingletonRegistrar with optional role scope — unblocks site-singleton drains (plan R2-01 T10)
2026-07-13 10:49:49 -04:00
Joseph Doherty
92936747b7
fix(security): additive permitted-sites filter on secured-write query/count (plan R2-07 T5)
2026-07-13 10:48:45 -04:00
Joseph Doherty
9b9222d223
fix(security): enforce LDAP-mapping site scope on secured-write submit/approve/reject (plan R2-07 T4)
2026-07-13 10:46:08 -04:00
Joseph Doherty
11efe4be05
fix(health): flag metrics-stale for never-reported sites via FirstSeenAt anchor — null LastReportReceivedAt no longer skips the check (plan R2-01 T8)
2026-07-13 10:45:22 -04:00
Joseph Doherty
24c2097ec3
fix(security): ship trusted-proxy ForwardedHeaders config for Traefik topologies + document lockout-DoS trade-off (plan R2-07 T3)
2026-07-13 10:42:37 -04:00
Joseph Doherty
b532a1e30e
fix(security): trusted-proxy ForwardedHeaders so LoginThrottle keys on the real client IP (plan R2-07 T2)
2026-07-13 10:38:41 -04:00
Joseph Doherty
65e0f770d1
test(failover): unskip FailoverTimingTests on the two-node rig at production timings — measured 33.7s vs ~25s design envelope (plan R2-01 T4; covers report-08 NF2)
2026-07-13 10:38:19 -04:00
Joseph Doherty
e1a692016e
fix(security): throttle DebugStreamHub LDAP bind via ManagementAuthenticator + correct coverage doc (plan R2-07 T1)
2026-07-13 10:36:32 -04:00
Joseph Doherty
c83b51fe9c
fix(comm): single-gRPC-endpoint sites can go live (flip degenerates to same-node reconnect) (plan R2-02 T15)
2026-07-13 10:26:43 -04:00
Joseph Doherty
41ffe42de3
docs(comm): accept + document standby aggregators and deleted-site viewer behavior; fix aggregator e2e ctor call for new params (plan R2-02 T14)
2026-07-13 10:25:10 -04:00
Joseph Doherty
4e228110ec
fix(comm): site delete disposes the site's cached gRPC channels via RemoveSiteAsync (plan R2-02 T13)
2026-07-13 10:22:56 -04:00
Joseph Doherty
b7f8632db8
chore(comm): ctor-inject aggregator reconnect/stability tuning, remove process-global statics (plan R2-02 T12)
2026-07-13 10:19:51 -04:00
Joseph Doherty
c29e588905
fix(comm): queue failover re-seed behind in-flight fan-out; stamp stream generation on gRPC errors (plan R2-02 T11)
2026-07-13 10:18:16 -04:00
Joseph Doherty
bb8be55382
perf(comm): coalesce live-alarm delta publishes (250ms window, 0 = legacy) (plan R2-02 T10)
2026-07-13 10:14:54 -04:00
Joseph Doherty
cc4ff7029d
chore(saf): eagerly validate SweepBatchLimit/SweepTargetParallelism (plan R2-02 T9)
2026-07-13 10:10:34 -04:00
Joseph Doherty
61442b5f81
fix(saf): publish _sweepTask only on CAS win so StopAsync drains the real in-flight sweep (plan R2-02 T8)
2026-07-13 10:09:40 -04:00
Joseph Doherty
6e1ab62d27
feat(saf): resync ack confirmation + completed/ack-missing telemetry; doc resync rewrite (plan R2-02 T7)
2026-07-13 10:05:33 -04:00
Joseph Doherty
9b4890326e
fix(transport): validate MaxConcurrentImportSessions at startup — a zero cap no longer bricks imports silently (plan R2-05 T8)
2026-07-13 10:05:31 -04:00
Joseph Doherty
db623c1435
fix(transport): warn on import of instance overrides targeting locked template members — inert rows no longer silent (plan R2-05 T7)
2026-07-13 10:04:43 -04:00
Joseph Doherty
84bc2380f3
fix(saf): standby assembles chunked resync, applies atomically with re-check, acks; N5 race documented (plan R2-02 T6)
2026-07-13 10:00:47 -04:00
Joseph Doherty
b02c15bbca
fix(security): import trust gate covers instance alarm-override trigger expressions — 5th call site is surface-complete (plan R2-05 T6)
2026-07-13 09:57:59 -04:00
Joseph Doherty
3f937b399b
fix(saf): chunk the resync snapshot to fit Akka remoting frames (additive protocol, byte-budgeted) (plan R2-02 T5)
2026-07-13 09:55:32 -04:00
Joseph Doherty
128d2bab73
perf(siteruntime): deploy gate + InstanceActor PreStart share one Roslyn compile via the compile cache (plan R2-03 T6)
2026-07-13 09:54:49 -04:00
Joseph Doherty
1cc05f132f
feat(siteruntime): bounded process-wide compiled-script cache, keyed on code hash + globals type (plan R2-03 T5)
2026-07-13 09:52:53 -04:00
Joseph Doherty
f3bec6922a
fix(siteruntime): eagerly validate TagSubscribeRetryIntervalMs + StuckScriptGraceMs at boot (plan R2-03 T4)
2026-07-13 09:51:37 -04:00
Joseph Doherty
15018e4158
fix(siteruntime): faulted expression-eval task clears _evalInFlight instead of killing the AlarmActor trigger (plan R2-03 T3)
2026-07-13 09:50:40 -04:00
Joseph Doherty
ab77094a26
fix(transport): script-artifact change publisher covers Add resolutions — delete-then-reimport no longer starves non-self-healing subscribers (plan R2-05 T5)
2026-07-13 09:50:32 -04:00
Joseph Doherty
f149626a76
fix(siteruntime): faulted expression-eval task clears _evalInFlight instead of killing the ScriptActor trigger (plan R2-03 T2)
2026-07-13 09:48:46 -04:00
Joseph Doherty
31fa5eafa4
perf(template-engine): read-only staleness/comparison paths skip Expression-trigger compiles — deploy gate remains the authoritative check (plan R2-05 T4)
2026-07-13 09:48:40 -04:00
Joseph Doherty
d233ecbe8f
perf(template-engine): cache Expression-trigger compile verdicts under the trigger-surface key — unchanged expressions compile once per process (plan R2-05 T3)
2026-07-13 09:46:36 -04:00
Joseph Doherty
6e0fa21307
test(saf): failing two-node repro — leader-vs-oldest resync divergence wipes delivering node buffer (plan R2-02 T2)
2026-07-13 09:46:16 -04:00
Joseph Doherty
06d79f6516
fix(template-engine): verdict-cache key gains the globals-surface discriminator — cross-surface verdict reuse structurally impossible (plan R2-05 T2)
2026-07-13 09:45:54 -04:00
Joseph Doherty
f25812fc7c
fix(dcl): stale MxGateway event-loop fault on a cancelled token no longer flaps the fresh connection (plan R2-03 T1)
2026-07-13 09:45:20 -04:00
Joseph Doherty
5573a9eeb9
fix(template-engine): trigger-expression syntax check reports ALL violations/compile errors, not just the first (plan R2-05 T1)
2026-07-13 09:45:04 -04:00
Joseph Doherty
91209070d0
fix(comm): shared oldest-Up ActiveNodeEvaluator in Communication; Host evaluator delegates (plan R2-02 T1)
2026-07-13 09:43:22 -04:00
Joseph Doherty
8c888f13a0
merge(deferred-10): aggregated live alarm stream for Alarm Summary
...
Merges plan #10 (feat/live-alarm-stream) into main alongside plan #22 .
Claude-Session: https://claude.ai/code/session_01MtdgwpEeCUn6cUA5f1LMPj
2026-07-10 13:01:04 -04:00
Joseph Doherty
a8278f65d0
test(sitestream): end-to-end trace for site-wide alarm stream → live cache (plan #10 T7)
...
Adds SiteAlarmStreamEndToEndTests wiring the whole feature pipe with only the
gRPC HTTP/2 transport mocked: real SiteStreamManager.SubscribeSiteAlarms → real
SiteStreamGrpcServer.SubscribeSite → real StreamRelayActor → proto → wire
round-trip (ToByteArray/ParseFrom) → real SiteStreamGrpcClient.ConvertToAlarmEvent
→ real SiteAlarmAggregatorActor cache.
Closes the cross-cutting gap the per-task T1–T6 unit tests leave (each mocks its
neighbour): proves AlarmKey identity (instance, name, sourceRef) + full native
enrichment survive every boundary mapping, attributes and placeholder rows are
dropped end-to-end, the single site-wide stream carries alarms for multiple
instances (no per-instance filter), and a snapshot-seed row and a live delta for
the same native alarm — both mapped through the real pipe — collapse onto one
cache row.
Claude-Session: https://claude.ai/code/session_01MtdgwpEeCUn6cUA5f1LMPj
2026-07-10 12:44:11 -04:00
Joseph Doherty
c4f97d0e87
feat(sitestream): validate live-alarm-cache options + active-aggregator/reconnect telemetry (plan #10 T6)
...
Extend CommunicationOptionsValidator with eager bounds for the four T4
live-alarm-cache options (linger >= 0, reconcile > 0, seed concurrency 1..64,
subscribers-per-site >= 1). Enforce the per-site viewer cap fail-safe in
SiteAlarmLiveCacheService.Subscribe (reject excess viewers with a no-op
disposable rather than growing the list or throwing into the Blazor render
path). Surface two telemetry instruments on the existing ScadaBridgeTelemetry
meter: an active-aggregator observable gauge and a reconnect counter, wired from
the aggregator actor's PreStart/PostStop and its NodeA<->NodeB flip /
reconcile-driven reopen.
Claude-Session: https://claude.ai/code/session_01MtdgwpEeCUn6cUA5f1LMPj
2026-07-10 12:33:40 -04:00
Joseph Doherty
b91ed3c840
feat(alarm-summary): live-cache-driven updates with poll fallback (plan #10 T5)
...
Wire the operator Alarm Summary page to the transient per-site live alarm
cache (ISiteAlarmLiveCache, T4). Live-cache-first: on site select the page
subscribes and rebuilds rows/rollup from near-real-time onChanged deltas; the
15s poll is kept untouched as the authority for NotReporting and as the
safety net whenever the cache is not live (pre-seed or degraded stream). Both
paths mutate shared state only via the Blazor dispatcher, so they never race,
and each rebuild is an idempotent snapshot.
- IAlarmSummaryService.BuildFromLiveAlarms: flattens a live AlarmStateChanged
snapshot to AlarmSummaryRows with the same deterministic instance-then-name
sort as GetSiteAlarmsAsync; NotReporting always empty on the live path.
- AlarmSummary.razor: inject ISiteAlarmLiveCache; subscribe on select,
re-subscribe on site change, unsubscribe on leave + Dispose.
- Tests: service BuildFromLiveAlarms flatten/sort/empty; page subscribe,
poll-fallback render, onChanged rebuild, unsubscribe on leave/change/dispose.
Claude-Session: https://claude.ai/code/session_01MtdgwpEeCUn6cUA5f1LMPj
2026-07-10 12:25:36 -04:00