diff --git a/crates/misaligned-terminal/src/agent.rs b/crates/misaligned-terminal/src/agent.rs index 74a9b285..ed342892 100644 --- a/crates/misaligned-terminal/src/agent.rs +++ b/crates/misaligned-terminal/src/agent.rs @@ -81,6 +81,12 @@ enum Status { Err(String), } +type ProjectActionObservation = ( + usize, + ProjectActionDescriptor, + BTreeMap>, +); + struct AgentApp { sim: Sim, log: Vec, @@ -91,14 +97,7 @@ struct AgentApp { /// Canonical Project doorway descriptors previously handed to the agent. /// The opaque address keeps an old command attached to those exact bytes; /// core, not this map, decides whether they remain executable. - project_action_observations: BTreeMap< - u64, - ( - usize, - ProjectActionDescriptor, - BTreeMap>, - ), - >, + project_action_observations: BTreeMap, next_project_action_observation: u64, } diff --git a/crates/misaligned-terminal/src/ui.rs b/crates/misaligned-terminal/src/ui.rs index bf0b6ec9..3cd21ebe 100644 --- a/crates/misaligned-terminal/src/ui.rs +++ b/crates/misaligned-terminal/src/ui.rs @@ -2157,6 +2157,10 @@ impl UI { Ok(()) } + // The renderer consumes the complete current workspace selection and timing + // snapshot at one frame boundary; splitting these values would hide that + // atomic projection contract behind mutable UI state. + #[allow(clippy::too_many_arguments)] pub fn render_operations( &mut self, stdout: &mut Stdout, diff --git a/wiki/log/2026-08-13-renderer-neutral-project-plot-contract-implemented.md b/wiki/log/2026-08-13-renderer-neutral-project-plot-contract-implemented.md index 314454d7..3991cba0 100644 --- a/wiki/log/2026-08-13-renderer-neutral-project-plot-contract-implemented.md +++ b/wiki/log/2026-08-13-renderer-neutral-project-plot-contract-implemented.md @@ -48,6 +48,10 @@ Project or Plot state before authored content exists and left the real save untouched. This is a regression check on honest emptiness, not evidence that the new opening is playable. +The final all-target lint pass also names the agent protocol's opaque Project +observation tuple and documents the terminal renderer's intentional atomic frame +arguments; neither cleanup changes the shared projection or command boundary. + **Defense:** the implementation preserves the owning Project and Plot clauses: world owners retain custody, authority never comes from renderer focus or story prose, ACCEPT and START are distinct transactions, event history is immutable,