Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
f821534
test(reputation): add contract crate workspace
seonghobae Sep 6, 2026
4681872
test(reputation): scaffold contract crate
seonghobae Sep 6, 2026
7b3b297
test(reputation): expose contract model module
seonghobae Sep 6, 2026
4cf6e93
test(reputation): add deliberately permissive v1 contract stub
seonghobae Sep 6, 2026
6959689
test(reputation): add synthetic exact-host contract fixture
seonghobae Sep 6, 2026
1eff7d2
test(reputation): add hostile v1 contract RED
seonghobae Sep 6, 2026
21c2b9c
test(reputation): lock contract workspace
seonghobae Sep 6, 2026
b912182
fix(reputation): restore generated lock integrity
seonghobae Sep 6, 2026
d8c9165
chore(reputation): bootstrap generated lock artifact
seonghobae Sep 6, 2026
00cb63e
ci(reputation): materialize formatted bootstrap output
seonghobae Sep 6, 2026
c1c8c52
ci(reputation): preserve existing dependency lock
seonghobae Sep 6, 2026
48dff58
test(reputation): reach semantic contract RED
seonghobae Sep 6, 2026
75f5a45
ci(reputation): execute semantic RED on alternate hosted pool
seonghobae Sep 6, 2026
880fc7b
fix(reputation): fail closed on invalid v1 contracts
seonghobae Sep 6, 2026
3e6bead
style(reputation): apply rustfmt to contract validator
seonghobae Sep 6, 2026
0254533
ci(reputation): remove completed semantic rescue lane
seonghobae Sep 6, 2026
87d390c
test(reputation): bind decisions to request and evidence identity
seonghobae Sep 6, 2026
f7f6a9d
ci(reputation): execute decision-binding RED on hosted macOS
seonghobae Sep 6, 2026
9a07c7a
style(reputation): format decision-binding RED
seonghobae Sep 6, 2026
64ea63b
style(reputation): apply exact rustfmt to binding RED
seonghobae Sep 6, 2026
0cea14e
fix(reputation): bind decisions to context and evidence generation
seonghobae Sep 6, 2026
42b26ea
ci(reputation): retire completed decision-binding rescue
seonghobae Sep 6, 2026
23d2b3f
test(reputation): require provenance for enforcement evidence
seonghobae Sep 6, 2026
7e058de
ci(reputation): execute provenance RED on hosted macOS
seonghobae Sep 6, 2026
8577085
ci(reputation): bind provenance RED to exact source head
seonghobae Sep 6, 2026
71086b1
fix(reputation): reject untraceable enforcement evidence
seonghobae Sep 6, 2026
f549c3d
ci(reputation): retire completed provenance rescue
seonghobae Sep 6, 2026
c069999
test(reputation): reject untraceable adverse decisions
seonghobae Sep 6, 2026
3d83ec7
ci(reputation): execute adverse-evidence RED on hosted macOS
seonghobae Sep 6, 2026
ba962a1
test(reputation): make adverse-evidence RED executable
seonghobae Sep 6, 2026
ef8fed6
fix(reputation): reject untraceable adverse decisions
seonghobae Sep 6, 2026
5629290
ci(reputation): retire adverse-evidence rescue
seonghobae Sep 6, 2026
f686821
test(reputation): forbid known-malicious allow decisions
seonghobae Sep 6, 2026
7e33ee8
ci(reputation): execute action-consistency RED on hosted macOS
seonghobae Sep 6, 2026
94c0dde
fix(reputation): fail closed on adverse allow actions
seonghobae Sep 6, 2026
d34cc92
ci(reputation): retire completed action-consistency rescue
seonghobae Sep 6, 2026
913cf4e
test(reputation): reject unavailable-authority allow
seonghobae Sep 6, 2026
414fb98
fix(reputation): fail closed on unhealthy authority allow
seonghobae Sep 6, 2026
c83149c
test(reputation): reject contradictory decision reasons
seonghobae Sep 6, 2026
ebf1dbb
ci(reputation): verify contradictory reason RED and causal fix
seonghobae Sep 6, 2026
92b7c04
fix(reputation): bind decision reason to assessment
seonghobae Sep 6, 2026
28e4bf3
ci(reputation): remove completed reason repair harness
seonghobae Sep 6, 2026
f1ebc06
test(reputation): preserve authority-failure precedence
seonghobae Sep 6, 2026
f1e0950
test(reputation): execute authority-precedence RED
seonghobae Sep 6, 2026
e040201
fix(reputation): preserve authority-failure reason precedence
seonghobae Sep 6, 2026
2e8f90b
ci(reputation): verify authority-precedence causal fix
seonghobae Sep 6, 2026
8e75415
test(reputation): reject denial reasons on allow envelopes
seonghobae Sep 6, 2026
e31f840
test(reputation): execute denial-reason RED
seonghobae Sep 6, 2026
990410e
fix(reputation): bind allow actions to business authorization
seonghobae Sep 6, 2026
94dc113
test(reputation): cover authorized unknown decision mapping
seonghobae Sep 6, 2026
afbbd99
ci(reputation): verify decision mapping repair
seonghobae Sep 6, 2026
f89c222
ci(reputation): remove completed decision verification workflow
seonghobae Sep 6, 2026
73a20dd
test(reputation): pin fail-closed decision error precedence
seonghobae Sep 6, 2026
dbb91e7
ci(reputation): execute error-precedence RED on exact source
seonghobae Sep 6, 2026
68df34b
test(reputation): pin provenance validation error
seonghobae Sep 6, 2026
62d17b9
docs(reputation): trace contract evidence rationale
seonghobae Sep 6, 2026
a5a4a01
docs(reputation): link contract traceability from crate
seonghobae Sep 6, 2026
71cf87b
docs(reputation): complete production contract rustdoc
seonghobae Sep 6, 2026
ffc5db2
fix(reputation): preserve fail-closed error precedence
seonghobae Sep 6, 2026
729c221
test(reputation): reject scope-widening unknown evidence fields
seonghobae Sep 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .github/workflows/reputation-error-precedence-red.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Reputation error precedence causal verification

on:
pull_request:
paths:
- '.github/workflows/reputation-error-precedence-red.yml'
- 'crates/wardnet-reputation-core/src/model.rs'
- 'crates/wardnet-reputation-core/tests/error_precedence.rs'

permissions:
contents: read

jobs:
verify:
runs-on: macos-15-arm64
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 1
- name: Assert exact PR source
env:
EXPECTED_HEAD: ${{ github.event.pull_request.head.sha }}
run: test "$(git rev-parse HEAD)" = "$EXPECTED_HEAD"
- uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable
with:
toolchain: stable
- name: Check formatting
run: cargo fmt --check
- name: Test reputation error precedence
run: cargo test --locked -p wardnet-reputation-core --test error_precedence
8 changes: 8 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description = "Rust-first WAF/IDS/AI SOC gateway with DNSBL and commercial readi
license = "MIT"

[workspace]
members = [".", "crates/waf-ids-core"]
members = [".", "crates/waf-ids-core", "crates/wardnet-reputation-core"]
resolver = "3"

[dependencies]
Expand Down
12 changes: 12 additions & 0 deletions crates/wardnet-reputation-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[package]
name = "wardnet-reputation-core"
version = "0.1.0"
edition = "2024"
description = "Pure Wardnet outbound site-reputation domain contracts and policy core"
license = "MIT"

[dependencies]
serde = { version = "1", features = ["derive"] }

[dev-dependencies]
serde_json = "1"
31 changes: 31 additions & 0 deletions crates/wardnet-reputation-core/TRACEABILITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Reputation contract research and standards traceability

This note records the evidence boundary for `wardnet-reputation-core`. The crate defines transport-neutral Wardnet domain contracts; it is not an anomaly detector, feed client, executable egress authority, or transport policy engine.

## Decision rationale

NIST Cybersecurity Framework (CSF) 2.0 treats Detect as outcomes for finding and analyzing possible cybersecurity attacks and compromises while leaving implementation mechanisms to the adopting organization. Wardnet therefore keeps the observed security assessment, evidence-authority health, and policy action as separate fields instead of treating a detector output as self-executing authorization.

Chandola, Banerjee, and Kumar (2009) show that anomaly-detection techniques depend on domain-specific assumptions about what distinguishes normal from anomalous behavior. That supports a conservative contract boundary here: absence of eligible adverse evidence is `unknown`, not evidence of benignness; producer confidence is retained as producer metadata rather than converted into a Wardnet probability; and an adverse classification remains traceable to reviewed evidence. The paper does **not** define Wardnet's `KnownMalicious`, `Suspicious`, or `Unknown` vocabulary. Those are Wardnet bounded-context terms for evidence state and must not be presented as categories from the paper.

The v1 contract therefore chooses:

- `KnownMalicious` only for eligible reviewed evidence that asserts a hard threat within explicit scope;
- `Suspicious` for adverse evidence that does not establish the hard-threat condition;
- `Unknown` when no eligible adverse match establishes safety;
- a separate `EvidenceHealthV1` so source outage or expiry can fail closed without rewriting the underlying assessment;
- a separate `PolicyActionV1`, because a Wardnet reputation allow only permits continuation to independent gates and is never executable EgressWeave transport authorization.

Rejected alternatives are: treating `unknown` as benign, aggregating producer confidence into an invented probability, using HTTP success as an authorization signal, or allowing business authorization to override adverse evidence. These choices would erase provenance or conflate observation, policy, and enforcement authority.

Load-balancing literature is intentionally not used to justify this contract shape. This crate performs no scheduling, dispatch, network I/O, or executable load balancing, so latency/implementation-overhead results from load-balancing systems are not causal evidence for the v1 data model. Performance and concurrency research becomes applicable when the evaluator/cache and measured deployment path are implemented; the implementation plan requires those later slices to profile and benchmark the real path rather than pre-justify this transport-neutral schema with unrelated systems results.

## Source handling

The ACM article is cited by DOI and bibliographic metadata only. Its publisher access is not assumed to grant redistribution rights, so no article PDF is copied into this repository. NIST CSF 2.0 is linked to its official NIST publication and DOI. Future local copies must be added only when redistribution terms are verified.

## References

Chandola, V., Banerjee, A., & Kumar, V. (2009). Anomaly detection: A survey. *ACM Computing Surveys, 41*(3), Article 15. https://doi.org/10.1145/1541880.1541882

Pascoe, C., Quinn, S., & Scarfone, K. (2024). *The NIST Cybersecurity Framework (CSF) 2.0* (NIST CSWP 29). National Institute of Standards and Technology. https://doi.org/10.6028/NIST.CSWP.29
12 changes: 12 additions & 0 deletions crates/wardnet-reputation-core/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//! Pure Wardnet outbound site-reputation contracts.
//!
//! This crate deliberately performs no HTTP, DNS, transport authorization, database I/O,
//! environment access, or LLM work. Executable outbound target interpretation remains an
//! EgressWeave responsibility; this crate only accepts already-canonical offline descriptors.
//!
//! The research, standards, rejected alternatives, and evidence-handling rationale for this
//! contract boundary are recorded in the adjacent [TRACEABILITY.md](../TRACEABILITY.md).

pub mod model;

pub use model::*;
Loading