pub struct AiGovernance {
pub team_allowlists: BTreeMap<String, Vec<String>>,
pub audit: bool,
pub dry_run: bool,
}Expand description
Model governance (DW-084 ai.governance): per-team model
allowlists plus a shadow-audit switch. A team is a POLICY name
(the same vocabulary the token budgets use for scope: policy):
every consumer attaching a policy with an allowlist entry is
restricted to that allowlist’s aliases. The check runs BEFORE
routing, against the client-facing alias (the model value in
the request body), so a typo or a renamed alias is blocked at the
edge rather than surfacing as a provider 404. Multiple policies
with allowlists that bind one request intersect (deny-wins): the
model must be in EVERY binding allowlist, matching the authz
deny-anywhere-wins principle. Consumers with no binding allowlist
policy are unrestricted (fail-open, the DW-017 default posture).
audit: true records BOTH allowed and denied attempts into the
ai_governance_events analytics table for shadow review.
Fields§
§team_allowlists: BTreeMap<String, Vec<String>>Per-policy (team) model allowlists. The key is the POLICY name
(the team), the value is the list of allowed client-facing
model aliases. A consumer attaching a policy listed here may
only call the aliases in its allowlist; a consumer attaching
no listed policy is unrestricted. Validation rejects an
allowlist entry that names an alias absent from ai.models
(an authoring error, not a runtime 404).
audit: boolWhen true, record model usage for shadow audit: BOTH allowed
calls and denied attempts land in the ai_governance_events
analytics table (the admin /analytics/governance-audit
endpoint reads it). When false (the default), only the
denial metric fires — no per-event audit rows are written.
dry_run: boolSEC-14 / CFG-14: dry-run mode. When true, the governance engine
evaluates the team allowlist and records would-be denials
(dwara_policy_dry_run_total{phase="ai_governance"} + a
structured log) but does NOT reject the request — the call
proceeds to the model. Useful for rolling out a new allowlist
without breaking existing callers. Default false (reject on
mismatch).
Trait Implementations§
Source§impl Clone for AiGovernance
impl Clone for AiGovernance
Source§fn clone(&self) -> AiGovernance
fn clone(&self) -> AiGovernance
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for AiGovernance
impl Debug for AiGovernance
Source§impl<'de> Deserialize<'de> for AiGovernance
impl<'de> Deserialize<'de> for AiGovernance
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for AiGovernance
impl JsonSchema for AiGovernance
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreSource§impl PartialEq for AiGovernance
impl PartialEq for AiGovernance
Source§impl Serialize for AiGovernance
impl Serialize for AiGovernance
impl StructuralPartialEq for AiGovernance
Auto Trait Implementations§
impl Freeze for AiGovernance
impl RefUnwindSafe for AiGovernance
impl Send for AiGovernance
impl Sync for AiGovernance
impl Unpin for AiGovernance
impl UnwindSafe for AiGovernance
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more