Side A makes a real code change with a behavioral fix (each unranked sibling gets its own nav group instead of being lumped together) plus a new test verifying the behavior, providing lasting functional value. Side B only appends a one-line note to a personal notes file, which is not functional code or documentation of lasting project value.
constitution · epochs · watch · epoch 3
c_3403e5929da7 (tommy-mor) vs c_fd8e599b6022 (tommy-mor)
download prompt · raw event · cmp_ff6a59137d924f
council reasoning
A changes real product behavior: unranked siblings become separate nav groups (with doc update and a regression test), lasting UI/structure value. B only appends one personal TODO line to notes.tdsl with no code, tests, or user-facing effect.
Side A changes application behavior by altering sibling navigation so each unranked sibling becomes its own navigation group instead of all unranked siblings being lumped together, updates the documentation to match, and adds a regression test verifying the new grouping. Side B only appends a brief project note ('new public thread form needs fewer words') to a notes file without affecting the code or behavior.
sides
A — c_3403e5929da7 (tommy-mor)
message
[65bce99f] sibling groups #130
diff preview
diff --git a/server/src/html/garden.rs b/server/src/html/garden.rs
index 82c1b4b4f36ea13a906035a1789ba893222b3695..e3c56d124ab7b0fa08c7f9ae736103e6b7cf5862 100644
--- a/server/src/html/garden.rs
+++ b/server/src/html/garden.rs
@@ -837,7 +837,8 @@ struct SiblingNavGroup {
links: Vec<SiblingNavLink>,
}
-/// Siblings under the same parent, grouped like child rankings (components then isolates).
+/// Siblings under the same parent: one group per ranking component (ordered list), then one
+/// group per isolated unranked sibling (each shows rank `1`, separated like components).
#[derive(Debug, Clone)]
struct SiblingNavBar {
groups: Vec<SiblingNavGroup>,
@@ -890,15 +891,12 @@ fn build_sibling_nav(
groups.push(SiblingNavGroup { links });
}
}
- if !rankings.unranked_items.is_empty() {
- let links: Vec<SiblingNavLink> = rankings
- .unranked_items
- .iter()
- .map(|u| SiblingNavLink {
+ for u in &rankings.unranked_items {
+ groups.push(SiblingNavGroup {
+ links: vec![SiblingNavLink {
path: u.clone().normalized_storage().to_storage_string(),
- })
- .collect();
- groups.push(SiblingNavGroup { links });
+ }],
+ });
}
let sibling_total: usize = groups.iter().map(|g| g.links.len()).sum();
if sibling_total <= 1 {
@@ -1541,6 +1539,29 @@ mod tests {
assert_eq!(nav.groups[1].links.len(), 1);
}
+ #[test]
+ fn sibling_nav_splits_each_unranked_into_its_own_group() {
+ let mut reduced = ReducerState::default();
+ apply_ingest(
+ &mut reduced,
+ 1,
+ "@00000000-0000-0000-0000-000000000000:test:local/test\n\
+ ~/topic {topic body}\n\
+ ~/topic/a {alpha}\n\
+ ~/topic/b {beta}\n\
+ ~/topic/c {gamma}\n\
+ ~/topic/d {delta}\n\
+ {a beats b}\n ~/topic/a 2:1 ~/topic/b\n",
+ );
+
+ let model = build_item_page_view_model(&reduced, &ScopeId::Public, "~/topic/a");
+ let nav = model.sibling_nav.expect("expected sibling nav");
+ assert_eq!(nav.groups.len(), 3);
+ assert_eq!(nav.groups[0].links.len(), 2);
+ assert_eq!(nav.groups[1].links.len(), 1);
+ assert_eq!(nav.groups[2].links.len(), 1);
+ }
+
#[test]
fn item_page_model_builds_ranked_child_components() {
let mut reduced = ReducerState::default();
B — c_fd8e599b6022 (tommy-mor)
message
[66da3bc4] note
diff preview
diff --git a/notes.tdsl b/notes.tdsl index 86e1e9cc78258a9669d14fc3baa19a1c586d7b66..a05487df6c445d9b333421e1d7781f2587f01298 100644 --- a/notes.tdsl +++ b/notes.tdsl @@ -26,3 +26,5 @@ maybe root item body should be hardcoded to flower? you can't define a body for need consistent + in corener of section header that morphs/expands in add form. i think morph. you can only see the form if you're logged in. my json-encoded plan is not being used for the forms. i want that same plan for the morphable/expandable + signs that produce forms. form target encoded... there was a plan.md with this. plan2.md... + +new public thread form needs fewer words
Hardlinks — judgments / attempts / prompt
judgments
attempts
Prompt text is loaded only by the download route.