Review remediation: Lane C — Control plane / host / security (fable for C1–C2, opus for C3–C5; review fable) #733
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
From the 2026-10-21 Fable system review. Findings
R0x:IDrefer todocs/reviews/2026-10-21/0x-*.md(location, evidence, failure scenario, fix recipe). Plan:docs/superpowers/plans/2026-10-22-review-remediation.md.Lane C — Control plane / host / security (fable for C1–C2, opus for C3–C5; review fable)
Owns:
src/Server/ZB.MOM.WW.OtOpcUa.ControlPlane/**,src/Server/ZB.MOM.WW.OtOpcUa.Host/**(exceptHost/Engines/**, which belongs to E),src/Server/ZB.MOM.WW.OtOpcUa.Security/**,src/Core/ZB.MOM.WW.OtOpcUa.Configuration/**(exceptValidation/DraftValidator.cs, which belongs to E).Tests:
ControlPlane.Tests,Host.Tests,Security.Tests,Configuration.Tests(central SQL)R03:2.2,3.2,3.5):Failed+ResetForNext).HandleDeadlinetakes the race branch only when_expectedAcks.Count > 0.Dispatchingrow and the expected set are created together in the coordinator.DraftSnapshotwith clusters/nodes/ApiKeys) inside aSNAPSHOTread transaction.ArtifactBlobaway in full-row reads.HandleDispatchthrow; the nextStartDeploymentsucceeds (positive control: a normal deploy seals).R03:3.1). MoveTestDriverConnectto a per-request child actor (orTask.Run+PipeTo) and run deploy compose off-actor; only the in-flight check is serialized. Test: an alarm ack completes in < 1 s while a 60 s Test Connect is pending.R03:2.1,1.4):OpcUaEndpointHealthCheck(Ready + Active tags), Unhealthy while the SDK failed to start.OpcUaServer/**), C only exposes the fact (IOpcUaEndpointState) and files anF<N>follow-up for Wave 3 to consume it.StopAsyncstops the SDK;DisposeAsyncis idempotent./health/ready503, and the ServiceLevel published drops.ApiKeyOptionsValidator+ValidateOnStart(non-blank pepper, minimum length, whenever driver or admin) (R03:2.3).R03:2.4, user decision):AddJwtBearerusingBuildValidationParameters();JwtOptionsValidateOnStartwhen/auth/tokenis mapped; the/api/*machine endpoints accept a Bearer token as well as API keys.IAuditActorAccessorthroughAuthenticationStateProvider, so audit rows carry the circuit principal (R03:2.5).CookieAuthenticationStateProvider.2.7).4.1).DeploymentRetentionActoron the admin singleton: keep the last N=50 sealed rows per cluster plus anything referenced in the last 30 days; nullArtifactBlobon older rows; configurableDeployments:Retention:*(R03:1.2).AuditWriterActorhandles duplicate keys per row (2601/2627 ⇒ detach and retry) (2.6).MeshGrpcCommandDialerevicts endpoints absent fromContactsLoaded(1.3).3.4).IDataPlaneAuthoritySource, refreshed everyStoreCacheSeconds; an unknown id is rejected without SQL; plus a per-endpoint token bucket (3.3).4.2fail-open window indocs/security.md.Lane gate: suites green. Wave 4 docker-dev gate: kill central-1 mid-dispatch, then the next deploy succeeds. Port 4840 taken ⇒
/health/ready503.