Add authority policy evaluator

This commit is contained in:
Meta Vens 2026-05-24 17:09:48 +01:00
commit 2d83ad07fc
3 changed files with 79 additions and 0 deletions

View file

@ -21,6 +21,8 @@ job-interview answer for why it belongs in the body of the machine.
| Camera ingest strategies | `Mimir.Runtime` + native workers | Diagnostic metadata, managed native wrapper, native SPSC ring, and shared-GPU-texture ingest shapes. | `src/Mimir.Runtime/Synchronization/MimirCameraIngestConfiguration.cs` |
| Reservoir strategies | `Mimir.Runtime` + native reservoir + Fensalir | Managed rolling buffers, native shared-edge rings, and derived GPU temporal field storage. | `src/Mimir.Runtime/Synchronization/MimirReservoirConfiguration.cs` |
| Distributed witnesses | `Mimir.Runtime` + CultMesh | Raven, phone, microcontroller, and remote camera rig configurations for compact timing/path state. | `src/Mimir.Runtime/Synchronization/MimirDistributedWitnessConfiguration.cs` |
| Network transports | `Mimir.Runtime` + CultMesh | Typed timing state, debug windows, SRT bridge media, and experimental browser transport policy. | `src/Mimir.Runtime/Synchronization/MimirNetworkTransportConfiguration.cs` |
| Authority policy | `Mimir.Runtime` | Trust decisions for Starfire loopback, Raven evidence, phone candidates, diagnostic media, and unknown nodes. | `src/Mimir.Runtime/Synchronization/MimirAuthorityPolicyConfiguration.cs`, `src/Mimir.Runtime/Synchronization/MimirAuthorityPolicyEvaluator.cs` |
| Audio field configurations | `Mimir.Runtime` | Six-mic, source-based, ambisonic, and hybrid evidence field shapes. | `src/Mimir.Runtime/Synchronization/MimirAudioFieldConfiguration.cs` |
| Visual fusion configurations | `Mimir.Runtime` + Fensalir | Sensor roles and fusion modes from cadence proof through full hybrid evidence. | `src/Mimir.Runtime/Synchronization/MimirVisualFusionConfiguration.cs` |
| Compute offload configurations | `Mimir.Runtime` + CultMesh | Local-heavy, distributed witness, and calibration sweep workload placement. | `src/Mimir.Runtime/Synchronization/MimirComputeOffloadConfiguration.cs` |

View file

@ -958,6 +958,10 @@ static int RunPerfectMachineProfileSmoke()
[
new MimirPairDelayObservation("mic-left", "mic-right", 0.0, 0.95)
]);
var authority = new MimirAuthorityPolicyEvaluator().Evaluate(new MimirAuthorityEvaluationInput(
"raven-scarlett-witness",
new HashSet<string>(["known-node", "matching-codebook", "clock-fit-confidence", "response-profile"], StringComparer.Ordinal),
new HashSet<string>(StringComparer.Ordinal)));
Console.WriteLine(
$"perfect-machine-profile-smoke profiles={profiles.Count} calibrationPlans={calibrationPlans.Count} audioFields={audioFields.Count} visualFields={visualFields.Count} computePlans={computePlans.Count} assemblyPlans={assemblyPlans.Count} captureProfiles={captureProfiles.Count} publications={publications.Count} languageProfiles={languageProfiles.Count} pathLearning={pathLearningProfiles.Count} localization={localizationProfiles.Count} benchmarkPanels={benchmarkPanels.Count} actuatorStrategies={actuatorStrategies.Count} cameraIngest={cameraIngestStrategies.Count} reservoirs={reservoirStrategies.Count} distributedWitnesses={distributedWitnesses.Count} networkTransports={networkTransports.Count} authorityPolicies={authorityPolicies.Count} modules={moduleCatalog.Count}");
@ -971,6 +975,8 @@ static int RunPerfectMachineProfileSmoke()
$"perfect-machine-fensalir gpuCameras={gpuFrame.Cameras.Count} gpuTextures={gpuFrame.ExternalTextures.Count} acousticConstraints={acousticFrame.Constraints.Count} timingConfidence={acousticFrame.TimingConfidence:0.000}");
Console.WriteLine(
$"perfect-machine-localization candidates={localizationGrid.Count} best=({localization?.PositionMeters.X ?? float.NaN:0.000},{localization?.PositionMeters.Y ?? float.NaN:0.000},{localization?.PositionMeters.Z ?? float.NaN:0.000}) score={localization?.Score ?? 0.0:0.000}");
Console.WriteLine(
$"perfect-machine-authority appliesTo=raven-scarlett-witness decision={authority.Decision} rule={authority.RuleId}");
return profiles.Count >= 6 &&
calibrationPlans.Count >= 3 &&
@ -997,6 +1003,7 @@ static int RunPerfectMachineProfileSmoke()
gpuFrame.HasInput &&
acousticFrame.HasInput &&
localization is { Score: > 0.90 } &&
authority.Decision == MimirAuthorityDecision.TrustedEvidence &&
clock is { AnchorCount: >= 4, Confidence: > 0.70 }
? 0
: 1;

View file

@ -0,0 +1,70 @@
namespace Mimir.Runtime.Synchronization;
public sealed record MimirAuthorityEvaluationInput(
string AppliesTo,
IReadOnlySet<string> Evidence,
IReadOnlySet<string> Conditions);
public sealed record MimirAuthorityEvaluationResult(
MimirAuthorityDecision Decision,
string RuleId,
string Notes);
public sealed class MimirAuthorityPolicyEvaluator(MimirAuthorityPolicyConfiguration? policy = null)
{
private readonly MimirAuthorityPolicyConfiguration policy = policy ?? MimirAuthorityPolicyConfigurations.DefaultTimingPolicy;
public MimirAuthorityEvaluationResult Evaluate(MimirAuthorityEvaluationInput input)
{
MimirAuthorityRule? wildcard = null;
foreach (var rule in policy.Rules)
{
if (rule.AppliesTo == "*")
{
wildcard ??= rule;
continue;
}
if (!string.Equals(rule.AppliesTo, input.AppliesTo, StringComparison.Ordinal))
{
continue;
}
if (RuleMatches(rule, input))
{
return new MimirAuthorityEvaluationResult(rule.Decision, rule.Id, rule.Notes);
}
}
if (wildcard != null && RuleMatches(wildcard, input))
{
return new MimirAuthorityEvaluationResult(wildcard.Decision, wildcard.Id, wildcard.Notes);
}
return new MimirAuthorityEvaluationResult(
MimirAuthorityDecision.ObserveOnly,
"default-observe-only",
"No trust rule matched; preserve observation without authority.");
}
private static bool RuleMatches(MimirAuthorityRule rule, MimirAuthorityEvaluationInput input)
{
foreach (var forbidden in rule.ForbiddenConditions)
{
if (input.Conditions.Contains(forbidden))
{
return false;
}
}
foreach (var required in rule.RequiredEvidence)
{
if (!input.Evidence.Contains(required))
{
return false;
}
}
return true;
}
}