Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
28 changes: 21 additions & 7 deletions crates/coven-threads-core/tests/phase5_retired_ward_corpus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,25 @@ fn corpus_documents_synthetic_provenance_without_historical_data() {
#[test]
fn valid_cases_cover_identity_approval_veto_and_region_fidelity() {
let cases = valid_cases();
assert_eq!(cases.len(), 4);
assert_eq!(cases.len(), 5);

let labels: Vec<_> = cases
.iter()
.map(|case| case["approval"]["label"].as_str().unwrap())
.collect();
assert_eq!(
labels,
["auto", "familiar_review", "human_review", "human_required"]
[
"auto",
"auto",
"familiar_review",
"human_review",
"human_required"
]
);
// The explicit `veto: null` case pins the hardened wire shape: the key is
// required for auto_regression, and a null value resolves to no window.
assert!(cases[1]["approval"]["veto"].is_null());
Comment on lines +112 to +114

let mut covered_regions = Vec::new();
for case in cases {
Expand Down Expand Up @@ -170,10 +179,15 @@ fn valid_cases_cover_identity_approval_veto_and_region_fidelity() {

covered_regions.sort();
covered_regions.dedup();
assert_eq!(
covered_regions,
["execution_prompt", "heartbeat_behavior", "tool_defaults"]
);
// Derived from the registry so a new built-in region flags corpus
// staleness instead of passing silently.
let mut built_in_regions: Vec<_> = SurfaceRegionRegistry::default_registry()
.descriptors()
.iter()
.map(|descriptor| descriptor.region_id.as_str().to_string())
.collect();
built_in_regions.sort();
assert_eq!(covered_regions, built_in_regions);
}

#[test]
Expand Down Expand Up @@ -234,6 +248,6 @@ fn canonical_generator_output_has_a_pinned_sha256_digest() {
let digest = Sha256::digest(corpus::canonical_corpus_json().as_bytes());
assert_eq!(
format!("{digest:x}"),
"b3c5f156896ed4ef03b3f57bb8e65a33a5cf6fe52582ccd8403972a20299db44"
"4ebe9d63398e6b14f2a097ce66197c96a577559984515ce03ce4297c0b0c7e10"
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,24 @@ pub fn synthetic_retired_ward_corpus() -> Value {
json!([]),
u8::MAX
),
valid_case(
"auto-no-veto",
0x55,
json!({
"kind": "auto_regression",
"label": "auto",
"veto": null
}),
json!([
{
"path": "MEMORY.md",
"before": "synthetic memory v2",
"after": "synthetic memory v3"
}
]),
json!([]),
u8::MAX
),
valid_case(
"familiar-review",
0x22,
Expand Down
7 changes: 6 additions & 1 deletion specs/PHASE-5-APPROVAL-SEMANTICS.md
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,12 @@ Phase 5 opened 2026-07-18 (Val + Nova decision). Beads are live.
approval labels, veto settings, built-in harness regions, and fail-closed
unsupported cases without using historical or private Ward data. Generate it
with `cargo run -q -p coven-threads-core --example
generate_phase5_retired_ward_corpus`.
generate_phase5_retired_ward_corpus`. The pinned SHA-256 of the canonical
corpus JSON is
`4ebe9d63398e6b14f2a097ce66197c96a577559984515ce03ce4297c0b0c7e10`; the
digest covers the single JSON line only, excluding the trailing newline the
example's `println!` appends (so `shasum` over the emitted file differs —
strip the final newline first, e.g. `... | tr -d '\n' | shasum -a 256`).
- `threads-uqx.9` — Nova sign-off: RFC round-trip, Gate-4 fail-closed proof,
descriptor-not-authority review.
- `threads-uqx.10` — Val freeze: Phase-5 design frozen or rejected.
Expand Down