From 83107b6f3da5fd7fd683d0c8a131b39c3fecc47a Mon Sep 17 00:00:00 2001 From: Eureka Date: Tue, 10 Nov 2026 19:20:50 +0000 Subject: [PATCH] Desk wire: an over-long fork id is fork_unknown, pinned by exact field Her vectors hold no over-long fork id (deviation recorded). Finding desk-wire-long-fork-id-body-invalid. Co-Authored-By: Claude Sonnet 5.5 --- crates/huginn-mind/src/desk_wire.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/huginn-mind/src/desk_wire.rs b/crates/huginn-mind/src/desk_wire.rs index 5c875c0..ba41ced 100644 --- a/crates/huginn-mind/src/desk_wire.rs +++ b/crates/huginn-mind/src/desk_wire.rs @@ -290,13 +290,14 @@ fn project(key: &str, stored: &PipelineDeskAnswer) -> Result DeskResponse { match refused { MindRefusal::MissingReference { .. } | MindRefusal::CampaignMoved { .. } => DeskResponse::NotStored(fork_unknown()), - MindRefusal::DeskRequestInvalid { field } if field == "fork" => DeskResponse::NotStored(fork_unknown()), + MindRefusal::DeskRequestInvalid { field } if field == "fork" || field == "desk_answer.fork" => DeskResponse::NotStored(fork_unknown()), MindRefusal::DeskRequestInvalid { field } => DeskResponse::NotStored(body_invalid(&field)), MindRefusal::DeskRequestIdConflict { .. } => { DeskResponse::NotStored(fork_refusal(ForkRefusalCode::RequestIdConflict, "request_id_conflict: this request_id was used for a different body".into())) @@ -827,6 +828,29 @@ mod tests { assert!(!conflict.error.contains("secret")); } + /// Her schema takes any non-empty string as a fork id and her vectors hold no over-long one; + /// no such id can name a fork, so it is `fork_unknown` like the empty one. Recorded deviation: + /// the bound is the Mind's 200 bytes (`desk_answer.fork`), and the answer is not `body_invalid`. + #[test] + fn an_over_long_fork_id_is_unknown() { + let mut mind = desk(); + let hash = hash_of(&mind, FORK); + let before = head(&mind); + for fork in [format!("{FORK}{}", "9".repeat(200)), format!("eureka-state:question:{}", "q".repeat(300))] { + let refusal = not_stored(ask(&mut mind, "x", wire(&fork, &hash)).0); + assert_eq!(refusal.code, ForkRefusalCode::ForkUnknown, "{} bytes", fork.len()); + assert_eq!(refusal, fork_unknown()); + } + assert_eq!(head(&mind), before); + // The mapping is by exact field: a field that merely ends in "fork" is a bad body. + for field in ["desk_answer.fork", "fork"] { + assert_eq!(not_stored(door_refusal(MindRefusal::DeskRequestInvalid { field: field.into() })).code, ForkRefusalCode::ForkUnknown, "{field}"); + } + for field in ["notfork", "desk_answer.forks", "desk_answer.fork.x", "request"] { + assert_eq!(not_stored(door_refusal(MindRefusal::DeskRequestInvalid { field: field.into() })).code, ForkRefusalCode::BodyInvalid, "{field}"); + } + } + #[test] fn wire_codes_are_snake_case() { let table = [