fix(ui): make session lineage lines read as arcs, not straight threads - #285
Merged
Conversation
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>
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 14, 2026
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The purple lines that join a tab to the workers its
codemanskill 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
clamp(14 + span * 0.06, 16, 44) + depth * 6becomesclamp(14 + span * 0.085, 22, 104) + depth * 8 + rowDrop.4 4->5 5(lineage-flowmoves 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.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.cssand the realcomputeLineagePath()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.