Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
62cc1f3
test(core-notify-stakeholders): backfill coverage to 100%/98%/97%
enricopiovesan Aug 22, 2026
88a2fc3
test(core-normalize-participants): backfill coverage to 100%/96%/95%
enricopiovesan Aug 22, 2026
75a703a
test(core-select-items-for-followup): backfill coverage to 100%/98%/97%
enricopiovesan Aug 22, 2026
712496d
test(core-evaluate-completion-quality): backfill coverage to 100%/95%…
enricopiovesan Aug 22, 2026
9da93fd
test(core-process-comment): backfill coverage to 100%/98%/98%
enricopiovesan Aug 22, 2026
635c17b
test(core-transition-action-status): backfill coverage to 100%/95%/97%
enricopiovesan Aug 22, 2026
fc01e6a
test(core-extract-action-items): backfill coverage to 100%/96%/97%
enricopiovesan Aug 22, 2026
1ea9471
test(core-validate-action-item): backfill coverage to 100%/96%/97%
enricopiovesan Aug 22, 2026
f428ed0
test(core-assign-ownership): backfill coverage to 100%/97%/97%
enricopiovesan Aug 22, 2026
f692fb1
test(core-authorize): backfill coverage to 100%/96%/96%
enricopiovesan Aug 22, 2026
67ae9e2
test(core-generate-nudge-message): backfill coverage to 100%/96%/98%
enricopiovesan Aug 22, 2026
31d60ec
test(core-calculate-price): backfill coverage to 100%/96%/97%
enricopiovesan Aug 22, 2026
85009f5
test(core-aggregate-team-action-health): backfill coverage to 100%/97…
enricopiovesan Aug 22, 2026
f4c8a0d
test(validate-email): backfill coverage to literal 100%/100%/100%
enricopiovesan Aug 22, 2026
71379b8
test(score-password-strength): backfill coverage to 100%/100%/99%
enricopiovesan Aug 22, 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
146 changes: 139 additions & 7 deletions capability-src/core-aggregate-team-action-health/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,10 +195,7 @@ fn write_error(out: &mut [u8], reason: &[u8]) -> usize {
}

fn is_open_status(s: &[u8]) -> bool {
matches!(
s,
b"open" | b"in_progress" | b"blocked" | b"snoozed"
)
matches!(s, b"open" | b"in_progress" | b"blocked" | b"snoozed")
}

fn bump_owner(owners: &mut [OwnerSlot], owner_count: &mut usize, owner: &[u8]) {
Expand Down Expand Up @@ -552,13 +549,148 @@ mod catalog_coverage_tests {
#[test]
fn use_case_01_happy() {
let out = run("{\"items\":[{\"id\":\"ai-1\",\"owner_id\":\"user-ada\",\"status\":\"open\",\"due_date\":\"2026-08-08\",\"pressure_score\":0.9},{\"id\":\"ai-2\",\"owner_id\":\"user-ada\",\"status\":\"in_progress\",\"due_date\":\"2026-08-15\",\"pressure_score\":0.3},{\"id\":\"ai-3\",\"owner_id\":\"user-bob\",\"status\":\"open\",\"due_date\":\"2026-08-01\",\"pressure_score\":0.95}],\"reference_date\":\"2026-08-07\",\"aggregation_config\":{\"version\":\"1.0\",\"overdue_threshold_days\":0}}");
assert!(out.contains("\"reason_code\":\"ok\""), "expected ok in {out}");
assert!(
out.contains("\"reason_code\":\"ok\""),
"expected ok in {out}"
);
}

#[test]
fn use_case_02_sad() {
let out = run("{\"items\":[],\"reference_date\":\"\",\"aggregation_config\":{\"version\":\"1.0\",\"overdue_threshold_days\":0}}");
assert!(out.contains("\"reason_code\":\"invalid_input\""), "expected invalid_input in {out}");
assert!(
out.contains("\"reason_code\":\"invalid_input\""),
"expected invalid_input in {out}"
);
}

}
#[test]
fn missing_config_yields_invalid_input() {
let out = run("{\"items\":[],\"reference_date\":\"2026-08-07\"}");
assert!(
out.contains("\"reason_code\":\"invalid_input\""),
"expected invalid_input in {out}"
);
}

#[test]
fn empty_items_array_yields_zero_percent_and_totals() {
let out = run("{\"items\":[],\"reference_date\":\"2026-08-07\",\"aggregation_config\":{}}");
assert!(out.contains("\"total_open\":0"));
assert!(out.contains("\"on_track_pct\":0"));
}

#[test]
fn closed_status_items_are_skipped() {
let out = run("{\"items\":[{\"id\":\"ai-1\",\"owner_id\":\"user-ada\",\"status\":\"done\",\"due_date\":\"2026-08-01\"}],\"reference_date\":\"2026-08-07\",\"aggregation_config\":{}}");
assert!(out.contains("\"total_open\":0"));
}

#[test]
fn owner_with_two_or_more_open_items_is_overloaded() {
let out = run("{\"items\":[{\"id\":\"ai-1\",\"owner_id\":\"user-ada\",\"status\":\"open\",\"due_date\":\"2026-08-08\"},{\"id\":\"ai-2\",\"owner_id\":\"user-ada\",\"status\":\"open\",\"due_date\":\"2026-08-09\"}],\"reference_date\":\"2026-08-07\",\"aggregation_config\":{}}");
assert!(out.contains("\"owner_id\":\"user-ada\",\"open_count\":2"));
}

#[test]
fn three_items_keep_only_top_two_by_pressure() {
let out = run("{\"items\":[{\"id\":\"low\",\"status\":\"open\",\"pressure_score\":0.1},{\"id\":\"high\",\"status\":\"open\",\"pressure_score\":0.9},{\"id\":\"mid\",\"status\":\"open\",\"pressure_score\":0.5}],\"reference_date\":\"2026-08-07\",\"aggregation_config\":{}}");
assert!(out.contains("\"high\""));
assert!(out.contains("\"mid\""));
assert!(!out.contains("\"low\""));
}

#[test]
fn tied_pressure_scores_break_by_lexical_id() {
let out = run("{\"items\":[{\"id\":\"bbb\",\"status\":\"open\",\"pressure_score\":0.5},{\"id\":\"aaa\",\"status\":\"open\",\"pressure_score\":0.5}],\"reference_date\":\"2026-08-07\",\"aggregation_config\":{}}");
assert!(out.contains("\"aaa\""));
assert!(out.contains("\"bbb\""));
}

#[test]
fn non_object_item_element_stops_scanning() {
let out = run("{\"items\":[{\"id\":\"ai-1\",\"status\":\"open\"},42],\"reference_date\":\"2026-08-07\",\"aggregation_config\":{}}");
assert!(out.contains("\"total_open\":1"));
}

#[test]
fn unterminated_item_object_stops_scanning() {
let out = run("{\"reference_date\":\"2026-08-07\",\"aggregation_config\":{},\"items\":[{\"id\":\"ai-1\",\"status\":\"open\"},{\"id\":\"ai-2\"]}");
assert!(out.contains("\"total_open\":1"));
}

#[test]
fn owner_slot_and_pressure_slot_clone_are_bitwise_copies() {
let owner = OwnerSlot {
id: [1u8; ID_MAX],
len: 1,
count: 5,
};
let cloned = owner.clone();
assert_eq!(cloned.count, 5);

let pressure = PressureSlot {
id: [2u8; ID_MAX],
len: 1,
score_millis: 900,
};
let cloned_p = pressure.clone();
assert_eq!(cloned_p.score_millis, 900);
}

#[test]
fn bump_owner_ignores_ids_longer_than_id_max() {
let mut owners = [OwnerSlot {
id: [0; ID_MAX],
len: 0,
count: 0,
}; MAX_OWNERS];
let mut count = 0usize;
let long_id = vec![b'x'; ID_MAX + 1];
bump_owner(&mut owners, &mut count, &long_id);
assert_eq!(count, 0);
}

#[test]
fn insert_top_pressure_ignores_ids_longer_than_id_max() {
let mut top = [
PressureSlot {
id: [0; ID_MAX],
len: 0,
score_millis: 0,
},
PressureSlot {
id: [0; ID_MAX],
len: 0,
score_millis: 0,
},
];
let long_id = vec![b'x'; ID_MAX + 1];
insert_top_pressure(&mut top, &long_id, 500);
assert_eq!(top[0].len, 0);
}

#[test]
fn array_after_key_at_depth_and_object_after_key_at_depth_handle_wrong_type() {
assert_eq!(array_after_key_at_depth(b"\"k\":5", b"\"k\"", 0), None);
assert_eq!(object_after_key_at_depth(b"\"k\":5", b"\"k\""), None);
}

#[test]
fn balanced_end_returns_none_when_unterminated() {
assert_eq!(balanced_end(b"{\"a\":\"b\"", b'{', b'}'), None);
}

#[test]
fn string_value_after_handles_missing_colon_quote_and_terminator() {
assert_eq!(string_value_after(b"no colon"), b"");
assert_eq!(string_value_after(b":not-a-quote"), b"");
assert_eq!(string_value_after(b":\"unterminated"), b"");
}

#[test]
fn parse_pressure_score_handles_missing_key_and_no_colon() {
assert_eq!(parse_pressure_score(b"{}"), 0);
assert_eq!(parse_pressure_score(b"\"pressure_score\"no-colon"), 0);
}
}
138 changes: 121 additions & 17 deletions capability-src/core-assign-ownership/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,15 @@ pub unsafe fn evaluate(input: &[u8], out: &mut [u8]) -> usize {
if suggested_null || suggested.is_empty() {
traces[trace_n] = b"suggested_owner null";
trace_n += 1;
return apply_fallback(out, fallback, creator, members, require_active, &mut traces, trace_n);
return apply_fallback(
out,
fallback,
creator,
members,
require_active,
&mut traces,
trace_n,
);
}

if let Some((id, method, note)) = resolve_member(members, suggested, require_active) {
Expand All @@ -112,7 +120,15 @@ pub unsafe fn evaluate(input: &[u8], out: &mut [u8]) -> usize {

traces[0] = b"no member match for suggestion";
trace_n = 1;
apply_fallback(out, fallback, creator, members, require_active, &mut traces, trace_n)
apply_fallback(
out,
fallback,
creator,
members,
require_active,
&mut traces,
trace_n,
)
}

fn apply_fallback<'a>(
Expand Down Expand Up @@ -168,13 +184,7 @@ fn apply_fallback<'a>(
traces[trace_n] = b"fallback=unassigned";
trace_n += 1;
}
write_result(
out,
None,
b"fallback_unassigned",
b"ok",
&traces[..trace_n],
)
write_result(out, None, b"fallback_unassigned", b"ok", &traces[..trace_n])
}
_ => {
if trace_n < MAX_TRACE {
Expand Down Expand Up @@ -469,43 +479,137 @@ mod catalog_coverage_tests {
#[test]
fn use_case_01_happy() {
let out = run("{\"suggested_owner\":\"Ada Lovelace\",\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-ada\",\"name\":\"Ada Lovelace\",\"email\":\"ada@loop.dev\"},{\"id\":\"user-bob\",\"name\":\"Bob Smith\",\"email\":\"bob@loop.dev\"}],\"ownership_config\":{\"version\":\"1.0\",\"fallback\":\"creator\",\"require_active_member\":true}}");
assert!(out.contains("\"reason_code\":\"ok\""), "expected ok in {out}");
assert!(
out.contains("\"reason_code\":\"ok\""),
"expected ok in {out}"
);
}

#[test]
fn use_case_02_happy() {
let out = run("{\"suggested_owner\":\"bob@loop.dev\",\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-ada\",\"name\":\"Ada Lovelace\",\"email\":\"ada@loop.dev\"},{\"id\":\"user-bob\",\"name\":\"Bob Smith\",\"email\":\"bob@loop.dev\"}],\"ownership_config\":{\"version\":\"1.0\",\"fallback\":\"creator\",\"require_active_member\":true}}");
assert!(out.contains("\"reason_code\":\"ok\""), "expected ok in {out}");
assert!(
out.contains("\"reason_code\":\"ok\""),
"expected ok in {out}"
);
}

#[test]
fn use_case_03_happy() {
let out = run("{\"suggested_owner\":null,\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-carol\",\"name\":\"Carol Jones\",\"email\":\"carol@loop.dev\"}],\"ownership_config\":{\"version\":\"1.0\",\"fallback\":\"creator\",\"require_active_member\":true}}");
assert!(out.contains("\"reason_code\":\"ok\""), "expected ok in {out}");
assert!(
out.contains("\"reason_code\":\"ok\""),
"expected ok in {out}"
);
}

#[test]
fn use_case_04_sad() {
let out = run("{\"suggested_owner\":\"Unknown Person\",\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-ada\",\"name\":\"Ada Lovelace\",\"email\":\"ada@loop.dev\"}],\"ownership_config\":{\"version\":\"1.0\",\"fallback\":\"fail\",\"require_active_member\":true}}");
assert!(out.contains("\"reason_code\":\"unresolved\""), "expected unresolved in {out}");
assert!(
out.contains("\"reason_code\":\"unresolved\""),
"expected unresolved in {out}"
);
}

#[test]
fn use_case_05_sad() {
let out = run("{\"suggested_owner\":\"user-ada\",\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-ada\",\"name\":\"Ada Lovelace\",\"email\":\"ada@loop.dev\",\"active\":false}],\"ownership_config\":{\"version\":\"1.0\",\"fallback\":\"fail\",\"require_active_member\":true}}");
assert!(out.contains("\"reason_code\":\"inactive_member\""), "expected inactive_member in {out}");
assert!(
out.contains("\"reason_code\":\"inactive_member\""),
"expected inactive_member in {out}"
);
}

#[test]
fn use_case_06_sad() {
let out = run("{\"suggested_owner\":\"Ada Lovelace\",\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-ada\",\"name\":\"Ada Lovelace\",\"email\":\"ada@loop.dev\"},{\"id\":\"user-bob\",\"name\":\"Bob Smith\",\"email\":\"bob@loop.dev\"}],\"ownership_config\":{\"version\":\"1.0\",\"fallback\":\"bogus\",\"require_active_member\":true}}");
assert!(out.contains("\"reason_code\":\"config_error\""), "expected config_error in {out}");
assert!(
out.contains("\"reason_code\":\"config_error\""),
"expected config_error in {out}"
);
}

#[test]
fn use_case_07_happy() {
let out = run("{\"suggested_owner\":\"Unknown Person\",\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-ada\",\"name\":\"Ada Lovelace\",\"email\":\"ada@loop.dev\"}],\"ownership_config\":{\"version\":\"1.0\",\"fallback\":\"unassigned\",\"require_active_member\":true}}");
assert!(out.contains("\"reason_code\":\"ok\""), "expected ok in {out}");
assert!(
out.contains("\"reason_code\":\"ok\""),
"expected ok in {out}"
);
}

#[test]
fn missing_config_yields_config_error() {
let out = run(
"{\"suggested_owner\":null,\"creator_id\":\"user-carol\",\"workspace_members\":[]}",
);
assert!(
out.contains("\"reason_code\":\"config_error\""),
"expected config_error in {out}"
);
}

#[test]
fn missing_fallback_key_defaults_to_creator() {
let out = run("{\"suggested_owner\":null,\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-carol\",\"name\":\"Carol Jones\",\"active\":true}],\"ownership_config\":{\"require_active_member\":true}}");
assert!(out.contains("\"resolution_method\":\"fallback_creator\""));
}

}
#[test]
fn fallback_creator_with_missing_creator_id_is_unresolved() {
let out = run("{\"suggested_owner\":null,\"workspace_members\":[],\"ownership_config\":{\"fallback\":\"creator\"}}");
assert!(
out.contains("\"reason_code\":\"unresolved\""),
"expected unresolved in {out}"
);
assert!(out.contains("creator_id missing"));
}

#[test]
fn fallback_creator_require_active_matches_creator_as_active_member() {
let out = run("{\"suggested_owner\":null,\"creator_id\":\"user-carol\",\"workspace_members\":[{\"id\":\"user-carol\",\"name\":\"Carol Jones\",\"active\":true}],\"ownership_config\":{\"fallback\":\"creator\",\"require_active_member\":true}}");
assert!(out.contains("\"owner_id\":\"user-carol\""));
assert!(out.contains("\"resolution_method\":\"fallback_creator\""));
}

#[test]
fn fallback_creator_without_require_active_accepts_creator_id_directly() {
let out = run("{\"suggested_owner\":null,\"creator_id\":\"user-zed\",\"workspace_members\":[],\"ownership_config\":{\"fallback\":\"creator\",\"require_active_member\":false}}");
assert!(out.contains("\"owner_id\":\"user-zed\""));
assert!(out.contains("\"resolution_method\":\"fallback_creator\""));
}

#[test]
fn is_null_at_depth_handles_missing_key_and_non_null_value() {
assert!(!is_null_at_depth(b"{}", b"\"missing\"", 1));
assert!(!is_null_at_depth(br#"{"k":5}"#, b"\"k\"", 0));
assert!(!is_null_at_depth(br#"{"k""#, b"\"k\"", 0));
}

#[test]
fn object_after_key_and_array_after_key_handle_missing_and_wrong_type() {
assert_eq!(object_after_key(b"{}", b"\"missing\""), None);
assert_eq!(object_after_key(br#"{"k":5}"#, b"\"k\""), None);
assert_eq!(array_after_key(b"{}", b"\"missing\""), None);
assert_eq!(array_after_key(br#"{"k":5}"#, b"\"k\""), None);
}

#[test]
fn balanced_end_returns_none_when_unterminated() {
assert_eq!(balanced_end(b"{\"a\":\"b\"", b'{', b'}'), None);
}

#[test]
fn string_value_after_handles_missing_colon_quote_and_terminator() {
assert_eq!(string_value_after(b"no colon"), b"");
assert_eq!(string_value_after(b":not-a-quote"), b"");
assert_eq!(string_value_after(b":\"unterminated"), b"");
}

#[test]
fn extract_bool_handles_false_and_neither() {
assert_eq!(extract_bool(b"\"k\":false", b"\"k\""), Some(false));
assert_eq!(extract_bool(b"\"k\":maybe", b"\"k\""), None);
}
}
Loading
Loading