Skip to content

fix(ui): make session lineage lines read as arcs, not straight threads - #285

Merged
Ark0N merged 1 commit into
masterfrom
fix/lineage-line-visibility
Aug 13, 2026
Merged

fix(ui): make session lineage lines read as arcs, not straight threads#285
Ark0N merged 1 commit into
masterfrom
fix/lineage-line-visibility

Conversation

@Ark0N

Copy link
Copy Markdown
Owner

The purple lines that join a tab to the workers its codeman skill spawned were tuned against two tabs sitting side by side, and they degrade in exactly the two situations the feature is used in. Reported as "they connect already, but the lines are straight and not easy visible".

What was wrong

1. Long spans flattened into a straight line. A spawned worker is appended to the END of the strip, so the real span between a lead and its worker is 800-1500px. With the dip clamped at 44px that is a 33px sag, i.e. a thread drawn across the terminal rather than a bracket hanging under the strip.

2. A wrapped strip drew a flat line inside the row gap. With tabs-two-rows / tabs-auto-wrap, a parent on row 1 and its child on row 2 are ~14px apart, and the cross-row branch aimed parent-bottom to child-top: 14px to bend in, with siblings overprinting each other.

3. The styling vanished at 1:1. 2px at opacity .55 with a single 5px glow reads on a zoomed mockup and disappears into terminal text on a real desktop.

What changed

  • One shape instead of two. Every pair, flat strip or wrapped, gets the U-bridge hanging below the strip, anchored on both tabs' BOTTOM edges with the control points below the LOWER row. The cross-row branch is gone.
  • Dip:clamp(14 + span * 0.06, 16, 44) + depth * 6 becomes clamp(14 + span * 0.085, 22, 104) + depth * 8 + rowDrop.
  • Weight and contrast: stroke 2 -> 2.5px, dashes 4 4 -> 5 5 (lineage-flow moves with them, -16 -> -20), opacity .55 -> .72, and a second wider glow so the contrast comes from the halo rather than from more weight. It stays under the subagent lines' 3px, so the two layers still read as different things.
  • A working child is bright (.95) outside the reduced-motion block, so turning motion off no longer also dims every worker's arc.
  • Direction dot 3 -> 3.5px (breathing to 4.5), sibling nesting 6 -> 8px, both to match the heavier stroke.

No behavior change beyond drawing: no reordering of tabs, no new endpoints, no new settings. Desktop-only as before.

Verification

Rendered at 1:1 in a harness driving the real styles.css and the real computeLineagePath() across three layouts (workers adjacent to their parent, workers at the far end of a full strip, and the reported wrapped two-row strip), on a dark and a light skin, with anchors probed against the measured tab rects.

test/session-lineage-lines.test.ts (9 tests) pins both regressions: a strip-wide span keeps bending, and a wrapped pair brackets below the lower row instead of inside the gap.

The lines that join a tab to the workers its codeman skill spawned were
drawn with numbers tuned against two tabs sitting side by side, and they
degraded in exactly the two situations the feature is actually used in.
1. A spawned worker is appended to the END of the strip, so the real span
between a lead and its worker is 800-1500px. With the dip clamped at
44px that is a 33px sag: the arc reads as a straight line drawn across
the terminal instead of a bracket hanging under the strip. The dip now
grows at 0.085/px and clamps at 104.
2. When the desktop strip wraps (tabs-two-rows / tabs-auto-wrap), a parent
on row 1 and its child on row 2 are ~14px apart, and the cross-row
branch drew parent-bottom to child-TOP: a flat line hidden inside the
row gap, with siblings overprinting each other. Both ends now anchor on
the tab BOTTOM with the control points below the LOWER row, so a wrapped
pair gets the same bracket a flat strip gets. That deletes the branch:
one shape covers both.
Visibility, at 1:1 rather than in a zoomed mockup: 2 -> 2.5px stroke,
4 4 -> 5 5 dashes (lineage-flow moves with them, -16 -> -20), opacity
.55 -> .72, and a second wider glow so the contrast comes from the halo
rather than from more weight, keeping the line under the subagent lines'
3px. A working child is bright (.95) outside the reduced-motion block, so
turning motion off no longer also dims every worker's arc. Sibling nesting
6 -> 8px and the direction dot 3 -> 3.5px to match the heavier stroke.
Verified at 1:1 in a harness driving the real styles.css and the real
computeLineagePath over three layouts (adjacent workers, workers at the
far end of a full strip, wrapped two-row strip) on a dark and a light
skin. test/session-lineage-lines.test.ts pins both regressions.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Ark0N
Ark0N merged commit 69d8a9e into masterAug 13, 2026
2 checks passed
@Ark0N
Ark0N deleted the fix/lineage-line-visibility branch August 13, 2026 23:01
CreatureSurvive pushed a commit to CreatureSurvive/Codeman that referenced this pull request Aug 17, 2026
Follow-up to Ark0N#285. Violet sits close to the terminal's own dim foreground,
so the arcs lost contrast exactly where they cross text, which is most of
their length. Blue reads at a glance on the dark skins and on the light
ones.
Colour still comes from a token every skin block already defines and tunes
for its own background (--session-blue instead of --session-purple), so it
stays one rule for all seven skins with no per-skin override, and the two
blues are not even the same: --session-blue is per palette while the
subagent rule hardcodes #3b82f6.
Hue no longer separates this layer from the subagent lines, so the
separation now rests entirely on shape (a lineage arc hangs under the strip
and never reaches a window), weight and dash pattern. Noted in the rule.
CSS only: no geometry, no markup, no settings.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Ark0N@claude