@exaudeus/workrail 3.28.0 → 3.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/console/assets/{index-C146q2kN.js → index-Bl5-Ghuu.js} +1 -1
- package/dist/console/index.html +1 -1
- package/dist/manifest.json +3 -3
- package/docs/README.md +57 -0
- package/docs/adrs/001-hybrid-storage-backend.md +38 -0
- package/docs/adrs/002-four-layer-context-classification.md +38 -0
- package/docs/adrs/003-checkpoint-trigger-strategy.md +35 -0
- package/docs/adrs/004-opt-in-encryption-strategy.md +36 -0
- package/docs/adrs/005-agent-first-workflow-execution-tokens.md +105 -0
- package/docs/adrs/006-append-only-session-run-event-log.md +76 -0
- package/docs/adrs/007-resume-and-checkpoint-only-sessions.md +51 -0
- package/docs/adrs/008-blocked-nodes-architectural-upgrade.md +178 -0
- package/docs/adrs/009-bridge-mode-single-instance-mcp.md +195 -0
- package/docs/adrs/010-release-pipeline.md +89 -0
- package/docs/architecture/README.md +7 -0
- package/docs/architecture/refactor-audit.md +364 -0
- package/docs/authoring-v2.md +527 -0
- package/docs/authoring.md +873 -0
- package/docs/changelog-recent.md +201 -0
- package/docs/configuration.md +505 -0
- package/docs/ctc-mcp-proposal.md +518 -0
- package/docs/design/README.md +22 -0
- package/docs/design/agent-cascade-protocol.md +96 -0
- package/docs/design/autonomous-console-design-candidates.md +253 -0
- package/docs/design/autonomous-console-design-review.md +111 -0
- package/docs/design/autonomous-platform-mvp-discovery.md +525 -0
- package/docs/design/claude-code-source-deep-dive.md +713 -0
- package/docs/design/console-cyberpunk-ui-discovery.md +504 -0
- package/docs/design/console-execution-trace-candidates-final.md +160 -0
- package/docs/design/console-execution-trace-candidates.md +211 -0
- package/docs/design/console-execution-trace-design-candidates-v2.md +113 -0
- package/docs/design/console-execution-trace-design-review.md +74 -0
- package/docs/design/console-execution-trace-discovery.md +394 -0
- package/docs/design/console-execution-trace-final-review.md +77 -0
- package/docs/design/console-execution-trace-review.md +92 -0
- package/docs/design/console-performance-discovery.md +415 -0
- package/docs/design/console-ui-backlog.md +280 -0
- package/docs/design/daemon-architecture-discovery.md +853 -0
- package/docs/design/daemon-design-candidates.md +318 -0
- package/docs/design/daemon-design-review-findings.md +119 -0
- package/docs/design/daemon-engine-design-candidates.md +210 -0
- package/docs/design/daemon-engine-design-review.md +131 -0
- package/docs/design/daemon-execution-engine-discovery.md +280 -0
- package/docs/design/daemon-gap-analysis.md +554 -0
- package/docs/design/daemon-owns-console-plan.md +168 -0
- package/docs/design/daemon-owns-console-review.md +91 -0
- package/docs/design/daemon-owns-console.md +195 -0
- package/docs/design/data-model-erd.md +11 -0
- package/docs/design/design-candidates-consolidate-dev-staleness.md +98 -0
- package/docs/design/design-candidates-walk-cache-depth-limit.md +80 -0
- package/docs/design/design-review-consolidate-dev-staleness.md +54 -0
- package/docs/design/design-review-walk-cache-depth-limit.md +48 -0
- package/docs/design/implementation-plan-consolidate-dev-staleness.md +142 -0
- package/docs/design/implementation-plan-walk-cache-depth-limit.md +141 -0
- package/docs/design/layer3b-ghost-nodes-design-candidates.md +229 -0
- package/docs/design/layer3b-ghost-nodes-design-review.md +93 -0
- package/docs/design/layer3b-ghost-nodes-implementation-plan.md +219 -0
- package/docs/design/list-workflows-latency-fix-plan.md +128 -0
- package/docs/design/list-workflows-latency-fix-review.md +55 -0
- package/docs/design/list-workflows-latency-fix.md +109 -0
- package/docs/design/native-context-management-api.md +11 -0
- package/docs/design/performance-sweep-2026-04.md +96 -0
- package/docs/design/routines-guide.md +219 -0
- package/docs/design/sequence-diagrams.md +11 -0
- package/docs/design/subagent-design-principles.md +220 -0
- package/docs/design/temporal-patterns-design-candidates.md +312 -0
- package/docs/design/temporal-patterns-design-review-findings.md +163 -0
- package/docs/design/test-isolation-from-config-file.md +335 -0
- package/docs/design/v2-core-design-locks.md +2746 -0
- package/docs/design/v2-lock-registry.json +734 -0
- package/docs/design/workflow-authoring-v2.md +1044 -0
- package/docs/design/workflow-docs-spec.md +218 -0
- package/docs/design/workflow-extension-points.md +687 -0
- package/docs/design/workrail-auto-trigger-system.md +359 -0
- package/docs/design/workrail-config-file-discovery.md +513 -0
- package/docs/docker.md +110 -0
- package/docs/generated/v2-lock-closure-plan.md +26 -0
- package/docs/generated/v2-lock-coverage.json +797 -0
- package/docs/generated/v2-lock-coverage.md +177 -0
- package/docs/ideas/backlog.md +3927 -0
- package/docs/ideas/design-candidates-mcp-resilience.md +208 -0
- package/docs/ideas/design-review-findings-mcp-resilience.md +119 -0
- package/docs/ideas/implementation_plan.md +249 -0
- package/docs/ideas/third-party-workflow-setup-design-thinking.md +1948 -0
- package/docs/implementation/02-architecture.md +316 -0
- package/docs/implementation/04-testing-strategy.md +124 -0
- package/docs/implementation/09-simple-workflow-guide.md +835 -0
- package/docs/implementation/13-advanced-validation-guide.md +874 -0
- package/docs/implementation/README.md +21 -0
- package/docs/integrations/claude-code.md +300 -0
- package/docs/integrations/firebender.md +315 -0
- package/docs/migration/v0.1.0.md +147 -0
- package/docs/naming-conventions.md +45 -0
- package/docs/planning/README.md +104 -0
- package/docs/planning/github-ticketing-playbook.md +195 -0
- package/docs/plans/README.md +24 -0
- package/docs/plans/agent-managed-ticketing-design.md +605 -0
- package/docs/plans/agentic-orchestration-roadmap.md +112 -0
- package/docs/plans/assessment-gates-engine-handoff.md +536 -0
- package/docs/plans/content-coherence-and-references.md +151 -0
- package/docs/plans/library-extraction-plan.md +340 -0
- package/docs/plans/mr-review-workflow-redesign.md +1451 -0
- package/docs/plans/native-context-management-epic.md +11 -0
- package/docs/plans/perf-fixes-design-candidates.md +225 -0
- package/docs/plans/perf-fixes-design-review-findings.md +61 -0
- package/docs/plans/perf-fixes-new-issues-candidates.md +264 -0
- package/docs/plans/perf-fixes-new-issues-review.md +110 -0
- package/docs/plans/prompt-fragments.md +53 -0
- package/docs/plans/ui-ux-workflow-design-candidates.md +120 -0
- package/docs/plans/ui-ux-workflow-discovery.md +100 -0
- package/docs/plans/ui-ux-workflow-review.md +48 -0
- package/docs/plans/v2-followup-enhancements.md +587 -0
- package/docs/plans/workflow-categories-candidates.md +105 -0
- package/docs/plans/workflow-categories-discovery.md +110 -0
- package/docs/plans/workflow-categories-review.md +51 -0
- package/docs/plans/workflow-discovery-model-candidates.md +94 -0
- package/docs/plans/workflow-discovery-model-discovery.md +74 -0
- package/docs/plans/workflow-discovery-model-review.md +48 -0
- package/docs/plans/workflow-source-setup-phase-1.md +245 -0
- package/docs/plans/workflow-source-setup-phase-2.md +361 -0
- package/docs/plans/workflow-staleness-detection-candidates.md +104 -0
- package/docs/plans/workflow-staleness-detection-review.md +58 -0
- package/docs/plans/workflow-staleness-detection.md +80 -0
- package/docs/plans/workflow-v2-design.md +69 -0
- package/docs/plans/workflow-v2-roadmap.md +74 -0
- package/docs/plans/workflow-validation-design.md +98 -0
- package/docs/plans/workflow-validation-roadmap.md +108 -0
- package/docs/plans/workrail-platform-vision.md +420 -0
- package/docs/reference/agent-context-cleaner-snippet.md +94 -0
- package/docs/reference/agent-context-guidance.md +140 -0
- package/docs/reference/context-optimization.md +284 -0
- package/docs/reference/example-workflow-repository-template/.github/workflows/validate.yml +125 -0
- package/docs/reference/example-workflow-repository-template/README.md +268 -0
- package/docs/reference/example-workflow-repository-template/workflows/example-workflow.json +80 -0
- package/docs/reference/external-workflow-repositories.md +916 -0
- package/docs/reference/feature-flags-architecture.md +472 -0
- package/docs/reference/feature-flags.md +349 -0
- package/docs/reference/god-tier-workflow-validation.md +272 -0
- package/docs/reference/loop-optimization.md +209 -0
- package/docs/reference/loop-validation.md +176 -0
- package/docs/reference/loops.md +465 -0
- package/docs/reference/mcp-platform-constraints.md +59 -0
- package/docs/reference/recovery.md +88 -0
- package/docs/reference/releases.md +177 -0
- package/docs/reference/troubleshooting.md +105 -0
- package/docs/reference/workflow-execution-contract.md +998 -0
- package/docs/roadmap/README.md +22 -0
- package/docs/roadmap/legacy-planning-status.md +103 -0
- package/docs/roadmap/now-next-later.md +70 -0
- package/docs/roadmap/open-work-inventory.md +389 -0
- package/docs/tickets/README.md +39 -0
- package/docs/tickets/next-up.md +76 -0
- package/docs/workflow-management.md +317 -0
- package/docs/workflow-templates.md +423 -0
- package/docs/workflow-validation.md +184 -0
- package/docs/workflows.md +254 -0
- package/package.json +4 -1
- package/spec/authoring-spec.json +61 -16
- package/workflows/workflow-for-workflows.json +3 -3
- package/workflows/workflow-for-workflows.v2.json +3 -3
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
# Discovery: Cyberpunk UI Design Language Gap Analysis
|
|
2
|
+
|
|
3
|
+
**Status:** Complete
|
|
4
|
+
**Date:** 2026-04-05
|
|
5
|
+
**Path:** `landscape_first` -- dominant need is understanding existing patterns and comparing against current state
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Context / Ask
|
|
10
|
+
|
|
11
|
+
The WorkRail developer console already has a cyberpunk-adjacent aesthetic (dark navy, amber accent, cyan for live states, cut corners, monospace ALL-CAPS labels, blueprint grid). The question is: compared to Cyberpunk 2077 and peer games in the high-tech dystopian genre, what specific visual elements are missing that would make the console feel authentically "cyberpunk" rather than merely "dark developer tool"?
|
|
12
|
+
|
|
13
|
+
**Desired outcome:** Concrete, implementable CSS/design changes ranked by impact.
|
|
14
|
+
|
|
15
|
+
**Anti-goals:**
|
|
16
|
+
- No full UI rebuild -- changes should layer onto existing foundations
|
|
17
|
+
- No game-level visual complexity (the tool must remain readable and functional)
|
|
18
|
+
- No decorative noise that impairs information density
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Landscape Packet
|
|
23
|
+
|
|
24
|
+
### Cyberpunk 2077 UI Design Language (CD Projekt Red, 2020-2023)
|
|
25
|
+
|
|
26
|
+
CD Projekt RED's art director on the UI, Filipe Duarte Pinto, described the design as "brutalist constructivism meets tech noir" -- a system that feels like it was designed by a corporation that no longer cares if you understand it.
|
|
27
|
+
|
|
28
|
+
#### Color Palette -- Precise Usage
|
|
29
|
+
|
|
30
|
+
CP2077 does NOT use amber/yellow everywhere uniformly. The palette has strict role separation:
|
|
31
|
+
|
|
32
|
+
| Color | Hex approx. | Role |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| Yellow-amber | `#f5e642` / `#ffd700` | **Primary interactive** -- buttons, active selections, key data values, your HP bar |
|
|
35
|
+
| Bright cyan | `#00e5ff` / `#00d4f0` | **Tech/netrunner** -- Quickhacks menu, scanner overlay, data shard readouts, network topology |
|
|
36
|
+
| Hot magenta/pink | `#ff2d78` / `#e91e8c` | **Hostile/danger** -- enemy indicators, Maelstrom gang interfaces, breach protocol threats |
|
|
37
|
+
| Desaturated orange | `#c87941` | **Corporate/Militech** -- Arasaka terminals use warm amber-orange, not pure yellow |
|
|
38
|
+
| Cold white | `#e8e8f0` | Body text, neutral readouts |
|
|
39
|
+
| Deep navy-black | `#0a0d1a` | Primary background -- even darker than our `#0f131f` |
|
|
40
|
+
| Mid-dark slate | `#141824` | Secondary panels |
|
|
41
|
+
|
|
42
|
+
**Key insight the console is missing:** CP2077 uses magenta/pink as the danger/hostile signal. The console's `--blocked` state uses `#ff4444` (pure red), which reads as "error" not "threat." A shift toward hot pink-red would add genre authenticity. More critically, the console uses **no pink/magenta at all** -- this absence makes the palette feel incomplete for the genre.
|
|
43
|
+
|
|
44
|
+
#### Typography -- Precise Characteristics
|
|
45
|
+
|
|
46
|
+
CP2077 main UI font: **Rajdhani** (weight 600-700) for headers, **Share Tech Mono** or similar for data readouts.
|
|
47
|
+
|
|
48
|
+
What makes it distinctive:
|
|
49
|
+
- **Extreme tracking on uppercase labels**: `letter-spacing: 0.3em` to `0.5em` on category headers -- much wider than typical UIs
|
|
50
|
+
- **Weight contrast is violent**: body text is often Regular (400), while section headers jump straight to Bold (700) or ExtraBold (800) -- no Medium weights in between
|
|
51
|
+
- **Number/value fields use tabular lining figures** in a condensed monospace -- values feel like live data instruments
|
|
52
|
+
- **Percentages and units are smaller**: a health value shows `78` large, `HP` small and muted beside it -- the value dominates, the unit is secondary
|
|
53
|
+
- **Slash separators between metadata**: `THREAT // MEDIUM` or `DMG / 47-62` -- double-slash is a CP2077 signature
|
|
54
|
+
- **ALL CAPS is selective**: body text is mixed case; only labels, categories, and system-level identifiers are ALL CAPS
|
|
55
|
+
|
|
56
|
+
The console already does ALL-CAPS labels with tracking. **What's missing:**
|
|
57
|
+
- The tracking is not aggressive enough (currently `tracking-[0.18em]`, should push to `0.28-0.40em` for label text)
|
|
58
|
+
- No aggressive weight contrast (no ExtraBold/800 weight on key values)
|
|
59
|
+
- No `//` separator pattern in metadata chips
|
|
60
|
+
|
|
61
|
+
#### Shape Language
|
|
62
|
+
|
|
63
|
+
1. **Clip paths everywhere, not just corners**: CP2077 uses clip-path cuts on all four corners, on progress bars, on text input fields, on dialog boxes. The cut is not always top-left -- it rotates. The console clips top-left only.
|
|
64
|
+
|
|
65
|
+
2. **Parallel diagonal lines as decorative elements**: Groups of 3-4 parallel diagonal lines (45 degrees) fill dead space in corners or beside progress bars. Pure decoration.
|
|
66
|
+
|
|
67
|
+
3. **Chevron separators `>>`**: Used as breadcrumb and section dividers in the game's menu system. More genre-specific than a `|` or `/`.
|
|
68
|
+
|
|
69
|
+
4. **Bracket notation `[ ]` around values**: Status values in CP2077 are often wrapped in square brackets -- `[HOSTILE]`, `[ONLINE]`, `[LOCKED]`. The console uses plain text or colored pills.
|
|
70
|
+
|
|
71
|
+
5. **Horizontal scan-line rule**: A thin horizontal rule that "scans" across a panel on load (an animated line that sweeps downward once, then holds). Used as a panel initialization signal.
|
|
72
|
+
|
|
73
|
+
6. **Diamond bullet points `◆`**: Instead of round dots, section bullets and list markers use filled diamonds.
|
|
74
|
+
|
|
75
|
+
#### Texture and Noise
|
|
76
|
+
|
|
77
|
+
1. **Scanlines overlay**: A repeating `linear-gradient` pattern of 1px semi-transparent dark lines every 2-3px, at ~3-5% opacity. Covers the entire UI or individual panels. CP2077 is subtle -- not retro-CRT heavy. This is the single most impactful "cheap" texture effect.
|
|
78
|
+
|
|
79
|
+
2. **Chromatic aberration on hover/glitch**: On state transitions (entering combat, taking damage), text and borders briefly show a 1-2px RGB channel separation -- a red ghost to the left, blue to the right. Implementable with `filter: blur(0.3px)` + pseudo-elements with `mix-blend-mode: screen`. Should be reserved for state changes only (not ambient).
|
|
80
|
+
|
|
81
|
+
3. **Noise grain texture**: A subtle SVG noise filter or `background-image: url(noise.svg)` at 2-4% opacity over dark backgrounds. Prevents the backgrounds from being "flat digital" -- they feel like worn surfaces.
|
|
82
|
+
|
|
83
|
+
4. **Vignette**: Radial gradient darkening at screen edges, extremely subtle (5-8% opacity dark overlay). Creates a sense of depth and focus on center content.
|
|
84
|
+
|
|
85
|
+
5. **Panel edge highlight**: A 1px highlight along the top edge of panels (`border-top: 1px solid rgba(255,255,255,0.06)`), simulating a light source from above. The console uses uniform border color on all sides.
|
|
86
|
+
|
|
87
|
+
#### Animation Patterns
|
|
88
|
+
|
|
89
|
+
1. **Text reveal / data-stream animation**: When a panel or value loads, characters are revealed character-by-character from left to right at ~40ms/char, or with a "scramble" effect where random characters precede the final value. This is ubiquitous in cyberpunk UIs (also: Deus Ex, Horizon, Alien: Isolation).
|
|
90
|
+
|
|
91
|
+
2. **Loading state: "scanning" bar**: Instead of a spinner, loading states use a horizontal bar that sweeps left-to-right repeatedly, with a trailing glow. The console shows static text "Loading sessions..."
|
|
92
|
+
|
|
93
|
+
3. **Wipe transitions**: Panel content transitions use a horizontal wipe (clip-path expanding from left) rather than opacity fade. This is the genre norm.
|
|
94
|
+
|
|
95
|
+
4. **Subtle flicker on appear**: On mount, elements briefly flicker (two rapid opacity 1->0->1 cycles in ~80ms total) simulating analog power-on. The console has no mount animation.
|
|
96
|
+
|
|
97
|
+
5. **Data pulse**: Key numeric values pulse their glow once every few seconds, as if sampling a live feed.
|
|
98
|
+
|
|
99
|
+
6. **Glitch frames**: Very rarely (1-2% chance per session), a horizontal strip of the UI shifts by 3-5px horizontally for a single frame (16ms), then corrects. Called a "glitch frame." In CP2077 this is tied to save/load transitions.
|
|
100
|
+
|
|
101
|
+
#### Information Density and Layout Patterns
|
|
102
|
+
|
|
103
|
+
1. **"Instrument cluster" layout for stats**: Groups of 3-4 metrics arranged in a compact horizontal band with separators between them, like a car dashboard. The console's metadata chips are close but use rounded pills (soft) rather than tight rectangular strips (hard).
|
|
104
|
+
|
|
105
|
+
2. **Progress bars instead of badge pills for numeric states**: Health, progress, completion -- all use thin (3-4px tall) horizontal bars with a flat fill, not rounded badges.
|
|
106
|
+
|
|
107
|
+
3. **Side-rule ticks on scales**: Numeric ranges (1-10) use small vertical tick marks on a horizontal axis. Not seen in console at all.
|
|
108
|
+
|
|
109
|
+
4. **"UPLINK ESTABLISHED" / status broadcast messages**: Temporary banner-style messages that slide in from an edge, display 2-3 seconds, then animate out. Used for system state changes. The console has no transient notification system.
|
|
110
|
+
|
|
111
|
+
5. **Hierarchical ID prefixes**: Data identifiers include a prefix/namespace visible in the UI -- `[NET::] 192.168.0.1`, `[SYS::] kernel_v2`. Our session IDs are plain UUIDs displayed mono with no visual hierarchy or namespace prefix.
|
|
112
|
+
|
|
113
|
+
#### Border and Frame Treatments
|
|
114
|
+
|
|
115
|
+
1. **Double-line borders**: Some CP2077 panels use a thin outer border + a slightly brighter inner border, 1-2px apart. Creates a "framed CRT screen" feel.
|
|
116
|
+
|
|
117
|
+
2. **Corner brackets instead of full borders**: Some UI elements show only the four corners (L-shaped line segments, ~8-12px long) rather than a full border rectangle. This is lighter and more distinctive than a full border.
|
|
118
|
+
|
|
119
|
+
3. **Border that's part amber, part cyan**: For "active" panels, the border color cycles around the perimeter -- top and left edges use the accent color, bottom and right use a muted version. Or: the current-node highlight uses an amber top border + transparent side/bottom.
|
|
120
|
+
|
|
121
|
+
4. **Dashed or dotted segments on inactive borders**: Elements that are "ready but not selected" use `border-style: dashed` with large `border-dash-gap`. Active/selected elements flip to solid.
|
|
122
|
+
|
|
123
|
+
5. **Diagonal corner mark in the opposite corner from the cut**: The top-left cut is balanced by a small accent-colored corner bracket in the bottom-right. The console has no such counterpoint.
|
|
124
|
+
|
|
125
|
+
#### Icon and Symbol Vocabulary
|
|
126
|
+
|
|
127
|
+
1. **Circuit trace decorations**: SVG paths that look like PCB traces -- right-angle lines that end in small filled squares. Used as spacers and borders between sections.
|
|
128
|
+
|
|
129
|
+
2. **Hexagonal frames for avatars / entity icons**: The game wraps profile pics and faction icons in a hexagonal clip-path with a glowing border. The console has round and square shapes only.
|
|
130
|
+
|
|
131
|
+
3. **Warning triangle with internal grid**: Hazard icons have a triangular outer shape filled with a 3x3 grid of small squares. Different from a generic `⚠`.
|
|
132
|
+
|
|
133
|
+
4. **Signal strength / network topology icons**: Small icon language showing bars (like wifi/cellular) to indicate connection quality or data flow. The console's branch/graph chips use GitHub-style SVG icons.
|
|
134
|
+
|
|
135
|
+
5. **Corporate logo watermarks**: Lightly watermarked faction logos appear in panel corners at 3-5% opacity. For the console: a faint WorkRail logomark in the corner of key panels would translate this idiom.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
### Comparable Games: UI Design Language Survey
|
|
140
|
+
|
|
141
|
+
#### Deus Ex: Human Revolution / Mankind Divided (Eidos-Montreal, 2011/2016)
|
|
142
|
+
|
|
143
|
+
**Designer:** Jonathan Jacques-Belletête (Art Director)
|
|
144
|
+
|
|
145
|
+
**Signature characteristics:**
|
|
146
|
+
- **Golden amber + black** -- even more committed to amber than CP2077. The amber is darker and more bronze: `#c8860a` to `#e8a010`. No cyan at all in the base palette.
|
|
147
|
+
- **Hexagonal geometry everywhere**: HUD elements, menu borders, loading screens, objective markers. The hexagon is a modular grid unit.
|
|
148
|
+
- **"Sarif Industries" tech aesthetic**: Corporate, premium, not street-level. UI feels engineered, not hacked.
|
|
149
|
+
- **Flat fills with sharp edges**: No gradients. Fills are solid -- either opaque or 0. The "layer" effect comes from overlapping flat shapes.
|
|
150
|
+
- **Animated amber glow on focus**: Selected items emit a directional amber glow, not a radial one. The glow bleeds toward the reading direction (left-to-right).
|
|
151
|
+
- **Typography: Orbitron / Eurostile**: Geometric, slightly condensed. Heavier on headers than CP2077.
|
|
152
|
+
|
|
153
|
+
**What the console could borrow:**
|
|
154
|
+
- The hex grid as a background or section divider element
|
|
155
|
+
- The directional glow (glow that bleeds left from a selected item, not radial from center)
|
|
156
|
+
- Bronze-amber as a variant of the current `#f4c430` -- the console's amber is slightly too yellow/bright; darkening to `#daa018` would feel more Deus Ex / premium
|
|
157
|
+
|
|
158
|
+
#### Observer (Bloober Team, 2017)
|
|
159
|
+
|
|
160
|
+
**Signature characteristics:**
|
|
161
|
+
- **VHS/CRT texture as primary aesthetic**: Heavy scanlines, interlacing artifacts, color bleed. More distorted than CP2077.
|
|
162
|
+
- **Green phosphor as accent**: Instead of amber, uses `#00ff41` matrix-green for system data.
|
|
163
|
+
- **Horror-tech fusion**: UI elements degrade when in disturbing areas -- borders corrupt, text fragments.
|
|
164
|
+
- **Hand-drawn elements mixed with digital**: Annotations and post-it notes overlaid on clean digital UI.
|
|
165
|
+
|
|
166
|
+
**What the console could borrow:**
|
|
167
|
+
- The idea of **UI degradation as state signal** (a session with `blocked` status could apply heavier noise/glitch treatment)
|
|
168
|
+
|
|
169
|
+
#### Ghostrunner (One More Level, 2020)
|
|
170
|
+
|
|
171
|
+
**Signature characteristics:**
|
|
172
|
+
- **Cyan + white on black**: Very limited palette. The one accent color (cyan) is used for everything interactive.
|
|
173
|
+
- **Minimal, speed-optimized UI**: Almost no HUD during play. When UI appears it's instant-on with sharp wipe animation.
|
|
174
|
+
- **Katakana/Japanese character sets as decoration**: Mixed into purely decorative contexts (not meaningful). Gives a Blade Runner 2049 atmosphere.
|
|
175
|
+
- **No borders -- only cuts and clips**: Shapes are defined by their clip-path, not by borders. Backgrounds clip against each other.
|
|
176
|
+
|
|
177
|
+
**What the console could borrow:**
|
|
178
|
+
- Using clip-paths as the sole shape definer for some elements (no visible border, just background color clipped to shape)
|
|
179
|
+
- Decorative unicode or character-set elements (would need careful restraint in a developer tool)
|
|
180
|
+
|
|
181
|
+
#### Horizon Zero Dawn / Forbidden West (Guerrilla Games, 2017/2022)
|
|
182
|
+
|
|
183
|
+
**Signature characteristics:**
|
|
184
|
+
- **Teal + orange**: Complementary pair, consistent with nature/tech fusion theme.
|
|
185
|
+
- **Holographic projection aesthetic**: UI elements appear as floating light projections -- translucent, with visible "projection edges."
|
|
186
|
+
- **Organic shapes mixed with angular**: Unlike pure cyberpunk, Horizon's UI has some curved paths.
|
|
187
|
+
- **"Focus" device aesthetic**: The in-universe interface device explains the UI's appearance -- tribal markings meeting tech.
|
|
188
|
+
|
|
189
|
+
**What the console could borrow:**
|
|
190
|
+
- The translucent panel aesthetic: panels have background-color at 60-70% opacity + backdrop-filter blur, creating "frosted hologram" depth
|
|
191
|
+
|
|
192
|
+
#### Dead Space (Visceral Games, 2008)
|
|
193
|
+
|
|
194
|
+
**Signature characteristics:**
|
|
195
|
+
- **All UI is diegetic**: Health bar on Isaac's back, ammo in the gun. Nothing on-screen that isn't "in world."
|
|
196
|
+
- **Red as primary danger signal**: Deep red for critical health, not just for error states.
|
|
197
|
+
- **Ultra-minimal information**: If it can be removed, it is. Every remaining element is load-bearing.
|
|
198
|
+
- **Sound design does UI work**: Audio stingers replace visual notifications for most events.
|
|
199
|
+
|
|
200
|
+
**What the console could borrow:**
|
|
201
|
+
- The "if it can be removed, it should" discipline -- some current UI chrome could be stripped
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
### Common Patterns Across All Genre UIs
|
|
206
|
+
|
|
207
|
+
1. **Color serves semantic roles, not aesthetic ones**: Every color signals a specific system-state. There is no decorative color usage.
|
|
208
|
+
|
|
209
|
+
2. **Scanlines or noise texture at low opacity**: Every one of these games uses some form of analog texture to break up flat digital surfaces. This is the single most cross-cutting element.
|
|
210
|
+
|
|
211
|
+
3. **Aggressive typography contrast**: Large values, tiny labels, no medium sizes. The jump is always large -> tiny, never large -> medium.
|
|
212
|
+
|
|
213
|
+
4. **Cut/clipped geometry over border-radius**: None of these games use rounded corners. All use clips, cuts, hex shapes, or squared edges.
|
|
214
|
+
|
|
215
|
+
5. **Animation as state signal**: Animations are purposeful and tied to state changes (power-on, data-load, error, threat-increase). They are not ambient decoration.
|
|
216
|
+
|
|
217
|
+
6. **Bracket / frame notation for status strings**: `[ONLINE]`, `[HOSTILE]`, `[LOCKED]` -- text status values are wrapped in bracket notation.
|
|
218
|
+
|
|
219
|
+
7. **Monospace for all data/values**: Even non-numeric data (IDs, names of system entities) uses monospace in these UIs. It signals "this is system data, not human prose."
|
|
220
|
+
|
|
221
|
+
8. **Horizontal progress indicators over circular**: Loading rings and spinners are rare. Horizontal sweeping bars are the genre norm.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Problem Frame Packet
|
|
226
|
+
|
|
227
|
+
**Users:** Developer using WorkRail console to monitor and interact with AI agent workflows.
|
|
228
|
+
|
|
229
|
+
**Jobs / outcomes:** Read session status at a glance, navigate to sessions and steps efficiently, feel trust in the system (the aesthetic communicates "this is a real system, not a prototype").
|
|
230
|
+
|
|
231
|
+
**Tensions:**
|
|
232
|
+
- Cyberpunk UI elements like heavy glitch/scanlines can impair readability for dense text
|
|
233
|
+
- Animation (text scramble, flicker) has accessibility implications
|
|
234
|
+
- Over-theming risks making the tool feel like a gimmick
|
|
235
|
+
|
|
236
|
+
**Success criteria:** A developer who opens the console thinks "this was designed deliberately" -- not "someone threw dark mode on a generic UI."
|
|
237
|
+
|
|
238
|
+
**Assumptions:** Changes are CSS/component additions, not a full rebuild.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Gap Analysis: What the Current Console Is Missing
|
|
243
|
+
|
|
244
|
+
Ranked by estimated authenticity-impact vs. implementation cost.
|
|
245
|
+
|
|
246
|
+
### Tier 1: Highest Impact, Low Cost (1-4 hours each)
|
|
247
|
+
|
|
248
|
+
#### 1. Scanlines texture overlay
|
|
249
|
+
**What:** A `::before` pseudo-element on the root layout covering the full viewport with a repeating gradient:
|
|
250
|
+
```css
|
|
251
|
+
background-image: repeating-linear-gradient(
|
|
252
|
+
transparent,
|
|
253
|
+
transparent 2px,
|
|
254
|
+
rgba(0, 0, 0, 0.03) 2px,
|
|
255
|
+
rgba(0, 0, 0, 0.03) 3px
|
|
256
|
+
);
|
|
257
|
+
```
|
|
258
|
+
Set `pointer-events: none; position: fixed; inset: 0; z-index: 9999`.
|
|
259
|
+
|
|
260
|
+
**Impact:** This single change makes a flat dark UI feel like it exists in a physical medium. All 5 surveyed games use this.
|
|
261
|
+
|
|
262
|
+
**Current state:** No scanlines. Backgrounds are perfectly flat.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
#### 2. Letter-spacing on labels pushed to genre-standard
|
|
267
|
+
**What:** The current `tracking-[0.18em]` is modest. Genre standard is `0.28em` to `0.40em` for all-caps label text.
|
|
268
|
+
|
|
269
|
+
CSS change: Update all instances of `font-mono text-[10px] uppercase tracking-[0.18em]` to `tracking-[0.30em]`.
|
|
270
|
+
|
|
271
|
+
**Impact:** Immediately more CP2077-like. No visual structure changes, pure typography.
|
|
272
|
+
|
|
273
|
+
**Current state:** `tracking-[0.18em]` -- correct direction but undershooting.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
#### 3. `//` separator in metadata chips
|
|
278
|
+
**What:** The chip component currently renders `{children}` as plain text. Metadata combinations like `"wr.discovery · 12 steps"` should render as `"wr.discovery // 12 steps"` -- the double-slash is a CP2077 signature separator that instantly telegraphs the genre.
|
|
279
|
+
|
|
280
|
+
Also applies to breadcrumbs (currently `Workflows / Tag` -- should be `WORKFLOWS // TAG`).
|
|
281
|
+
|
|
282
|
+
**Current state:** Uses `·` (middle dot) or `/` separators.
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
#### 4. Corner brackets instead of full borders on some elements
|
|
287
|
+
**What:** The `CutCornerBox` component gives a full clipped border. An additional variant (or wrapper utility class) shows only the four corner segments -- L-shaped lines of 8-10px length. This is lighter, more distinctive, and very CP2077.
|
|
288
|
+
|
|
289
|
+
```css
|
|
290
|
+
.corner-frame {
|
|
291
|
+
position: relative;
|
|
292
|
+
}
|
|
293
|
+
.corner-frame::before,
|
|
294
|
+
.corner-frame::after {
|
|
295
|
+
content: '';
|
|
296
|
+
position: absolute;
|
|
297
|
+
width: 10px;
|
|
298
|
+
height: 10px;
|
|
299
|
+
border-color: var(--accent);
|
|
300
|
+
border-style: solid;
|
|
301
|
+
}
|
|
302
|
+
.corner-frame::before {
|
|
303
|
+
top: 0; left: 0;
|
|
304
|
+
border-width: 1px 0 0 1px;
|
|
305
|
+
}
|
|
306
|
+
.corner-frame::after {
|
|
307
|
+
bottom: 0; right: 0;
|
|
308
|
+
border-width: 0 1px 1px 0;
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
The top-left cut corner handles one corner; the `::after` handles the bottom-right; two additional pseudo-elements (or children) handle the other two. This creates the "floating bracket" look.
|
|
313
|
+
|
|
314
|
+
**Current state:** Either full border or the cut-corner box (also full border). No corner-bracket variant.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
#### 5. Bracket notation for status values
|
|
319
|
+
**What:** The `StatusBadge` component renders "In Progress", "Dormant", etc. as rounded pills. Replace with bracket-wrapped ALL CAPS: `[ IN PROGRESS ]`, `[ DORMANT ]`, `[ BLOCKED ]`.
|
|
320
|
+
|
|
321
|
+
Visual: `font-mono`, no background fill, bracket characters in accent color, status text in accent color, tight padding.
|
|
322
|
+
|
|
323
|
+
This removes the `rounded` class and the background fill -- the brackets do the visual work instead.
|
|
324
|
+
|
|
325
|
+
**Current state:** Rounded pill with background fill. Reads as "modern SaaS" not "cyberpunk terminal."
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
### Tier 2: Medium Impact, Medium Cost (half-day to full-day each)
|
|
330
|
+
|
|
331
|
+
#### 6. Loading state: horizontal sweep bar
|
|
332
|
+
**What:** Replace "Loading sessions..." text with an animated horizontal bar that sweeps left-to-right.
|
|
333
|
+
|
|
334
|
+
```css
|
|
335
|
+
@keyframes scan-sweep {
|
|
336
|
+
from { transform: translateX(-100%); }
|
|
337
|
+
to { transform: translateX(400%); }
|
|
338
|
+
}
|
|
339
|
+
.loading-sweep {
|
|
340
|
+
height: 1px;
|
|
341
|
+
background: linear-gradient(90deg, transparent, var(--accent), transparent);
|
|
342
|
+
animation: scan-sweep 1.2s ease-in-out infinite;
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Current state:** Static text. Generic.
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
#### 7. Panel-on mount flicker animation
|
|
351
|
+
**What:** When a panel or list appears, apply a brief flicker (rapid opacity cycle):
|
|
352
|
+
|
|
353
|
+
```css
|
|
354
|
+
@keyframes panel-on {
|
|
355
|
+
0% { opacity: 0; }
|
|
356
|
+
20% { opacity: 0.8; }
|
|
357
|
+
25% { opacity: 0.2; }
|
|
358
|
+
30% { opacity: 1; }
|
|
359
|
+
100% { opacity: 1; }
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
Duration: ~180ms. Applied via a class added on mount and removed afterward.
|
|
363
|
+
|
|
364
|
+
**Current state:** No mount animation. Content appears instantly (or with Tailwind transitions that are gentle fades).
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
#### 8. Noise grain texture on panel backgrounds
|
|
369
|
+
**What:** Add an SVG turbulence filter or a 64x64 noise tile at 2-3% opacity over `--bg-card` panels.
|
|
370
|
+
|
|
371
|
+
Simplest implementation: base64-encoded PNG noise tile as a data URI in CSS, applied to `.bg-[var(--bg-card)]` at `opacity: 0.03`:
|
|
372
|
+
|
|
373
|
+
```css
|
|
374
|
+
.bg-card-panel {
|
|
375
|
+
background-image: url("data:image/png;base64,...[noise_tile]...");
|
|
376
|
+
background-repeat: repeat;
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**Current state:** Flat solid backgrounds. Feels "digital perfect" rather than "worn tech."
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
#### 9. Text data-stream reveal on panel open
|
|
385
|
+
**What:** When a session card or detail panel loads, text content reveals character-by-character. Implementable with a short JS animation (~30ms/char for title text only -- not body content) using `textContent` slice + `requestAnimationFrame`.
|
|
386
|
+
|
|
387
|
+
Alternatively: a simpler CSS approach -- text starts at full opacity but in a "scramble" state (mix of current chars and random placeholder chars), then resolves over 300ms.
|
|
388
|
+
|
|
389
|
+
**Current state:** Text appears instantly with no character-level animation.
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
#### 10. Status color: blocked/threat to pink-magenta
|
|
394
|
+
**What:** Change `--blocked: #ff4444` to `--blocked: #ff2070`.
|
|
395
|
+
|
|
396
|
+
`#ff2070` reads as "hostile/threat" in the CP2077 idiom. Pure red `#ff4444` reads as "error" -- a different semantic. Blocked workflows are not errors, they are threats to progress.
|
|
397
|
+
|
|
398
|
+
Also introduce `--hostile: #e91e8c` as a new semantic token for the most severe state (currently absent from the palette).
|
|
399
|
+
|
|
400
|
+
**Current state:** `--blocked: #ff4444` (pure red). No pink/magenta in the palette at all.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
### Tier 3: Higher Cost, High Authenticity (multi-day)
|
|
405
|
+
|
|
406
|
+
#### 11. Progress bars replacing pill badges for numeric values
|
|
407
|
+
**What:** The "N nodes / E edges" chip and the node count would be more genre-authentic as thin horizontal bars showing relative fill rather than text chips.
|
|
408
|
+
|
|
409
|
+
```jsx
|
|
410
|
+
<div className="flex items-center gap-1.5">
|
|
411
|
+
<span className="font-mono text-[9px] text-[var(--text-muted)]">NODES</span>
|
|
412
|
+
<div className="h-[3px] w-[40px] bg-[var(--bg-secondary)] relative">
|
|
413
|
+
<div style={{ width: `${pct}%` }} className="h-full bg-[var(--accent)]" />
|
|
414
|
+
</div>
|
|
415
|
+
<span className="font-mono text-[10px] tabular-nums text-[var(--text-primary)]">{count}</span>
|
|
416
|
+
</div>
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Current state:** Text chips with round corners.
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
#### 12. `[ SYS:: ]` namespace prefix on session IDs
|
|
424
|
+
**What:** Currently session IDs show as a raw UUID fragment in mono text. Adding a namespace prefix signals that this is an addressable system entity:
|
|
425
|
+
|
|
426
|
+
`[SYS::] …e7f3a9c2b41d` instead of `…e7f3a9c2b41d`
|
|
427
|
+
|
|
428
|
+
The `SYS::` prefix in amber, the ID itself in muted mono.
|
|
429
|
+
|
|
430
|
+
**Current state:** Plain ID string. No namespace visual hierarchy.
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
#### 13. Directed glow from selected state (Deus Ex idiom)
|
|
435
|
+
**What:** When a session card is selected/hovered, the glow bleeds to the right (reading direction), not radially outward. Implement with:
|
|
436
|
+
|
|
437
|
+
```css
|
|
438
|
+
.session-card:hover {
|
|
439
|
+
box-shadow: 4px 0 24px rgba(244, 196, 48, 0.2), 0 0 0 1px rgba(244, 196, 48, 0.3);
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
The horizontal offset `4px 0` instead of `0 0` creates direction.
|
|
444
|
+
|
|
445
|
+
**Current state:** Radial `border-color` change on hover. Symmetric.
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
#### 14. Diagonal decorative rule lines in dead panel space
|
|
450
|
+
**What:** Panels with empty lower portions (e.g., the workflow description panel when the description is short) could display a group of 3-4 parallel diagonal lines (45-degree hairlines) in the lower-right corner at 4% opacity.
|
|
451
|
+
|
|
452
|
+
Pure CSS with `linear-gradient` at a 45-degree angle.
|
|
453
|
+
|
|
454
|
+
**Current state:** Empty space.
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## Decision Log
|
|
459
|
+
|
|
460
|
+
### Why `landscape_first` over `full_spectrum`
|
|
461
|
+
|
|
462
|
+
The problem is well-framed: a specific tool, a specific aesthetic target, a known baseline. There is no risk of "solving the wrong problem" -- the ask is explicit. `full_spectrum` would add reframing steps that produce no additional value here.
|
|
463
|
+
|
|
464
|
+
### Why this order of priorities
|
|
465
|
+
|
|
466
|
+
The ranking is: cheapest-per-unit-of-genre-authenticity first. Scanlines and letter-spacing are pure CSS changes touching no components. Bracket notation requires component edits but changes no logic. Progress bars require new components and data shape changes.
|
|
467
|
+
|
|
468
|
+
### What is intentionally NOT recommended
|
|
469
|
+
|
|
470
|
+
- **Heavy glitch/chromatic aberration as ambient effect**: These are reserved for state transitions in CP2077, not as constant effects. As ambient effects they impair readability and feel cheap.
|
|
471
|
+
- **Replacing the font**: The current `-apple-system` / `Roboto` stack is readable at small sizes. Introducing Rajdhani or Orbitron risks readability regression at 10px label sizes on non-retina displays.
|
|
472
|
+
- **Katakana/Japanese decorative characters**: Acceptable in Ghostrunner because combat speed hides the lack of semantic meaning. In a developer tool where text is information, random unicode decorations would confuse more than delight.
|
|
473
|
+
- **Audio stingers for state changes**: Dead Space idiom. Not appropriate for a developer tool.
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## Final Summary
|
|
478
|
+
|
|
479
|
+
The current console has the right structural bones: the color palette is correct, the cut corners are authentic, the typography direction is right, the grid background is correct. The gaps are primarily in **texture** (no scanlines, no noise, flat surfaces), **animation** (no mount flicker, no sweep loader, no data reveal), **typography weight/spacing** (undershooting letter-spacing), and **symbol vocabulary** (no `//` separators, no bracket notation, no corner-frame variant, no namespace prefixes).
|
|
480
|
+
|
|
481
|
+
The single highest-leverage change is scanlines. The second is letter-spacing. Together they require under 2 hours and would make the console feel measurably more "in genre." The third is bracket notation for status badges -- this is a component change but a small one, and it eliminates the one element that currently reads as "SaaS app" rather than "cyberpunk terminal."
|
|
482
|
+
|
|
483
|
+
### Prioritized implementation list
|
|
484
|
+
|
|
485
|
+
| # | Change | Impact | Cost |
|
|
486
|
+
|---|---|---|---|
|
|
487
|
+
| 1 | Scanlines texture overlay | Very High | 30 min |
|
|
488
|
+
| 2 | Letter-spacing 0.18em -> 0.30em on labels | High | 20 min |
|
|
489
|
+
| 3 | `//` separators in chips and breadcrumbs | High | 45 min |
|
|
490
|
+
| 4 | Corner bracket frames (CSS utility) | High | 1 hr |
|
|
491
|
+
| 5 | Bracket notation for StatusBadge | High | 1 hr |
|
|
492
|
+
| 6 | Horizontal sweep loader | Medium | 1 hr |
|
|
493
|
+
| 7 | Panel mount flicker animation | Medium | 1 hr |
|
|
494
|
+
| 8 | Noise grain on panel backgrounds | Medium | 1.5 hr |
|
|
495
|
+
| 9 | Data-stream text reveal | Medium | 3 hr |
|
|
496
|
+
| 10 | `--blocked` to pink-magenta `#ff2070` | Low-Med | 15 min |
|
|
497
|
+
| 11 | Thin progress bars for numeric values | Medium | 3 hr |
|
|
498
|
+
| 12 | `[SYS::]` namespace prefix on IDs | Low-Med | 1.5 hr |
|
|
499
|
+
| 13 | Directional hover glow (Deus Ex) | Low-Med | 30 min |
|
|
500
|
+
| 14 | Diagonal decorative rules in dead space | Low | 1 hr |
|
|
501
|
+
|
|
502
|
+
**Confidence:** High on items 1-5 (pure CSS or small component changes, low regression risk). Medium on items 6-10 (require testing across all panel types). Lower on items 11-14 (data shape or interaction model changes).
|
|
503
|
+
|
|
504
|
+
**Residual risk:** Some of these changes (scanlines, noise) degrade on low-DPI displays. Test on a 1080p non-retina screen before shipping opacity values.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Design Candidates: WorkRail Console Three-Layer Execution Trace
|
|
2
|
+
|
|
3
|
+
## Problem Understanding
|
|
4
|
+
|
|
5
|
+
### Core tensions
|
|
6
|
+
- **T1: Spatial anchoring vs surface count** -- Layer 2 floating overlay provides spatial context (near the node) but creates two simultaneous surfaces from one click
|
|
7
|
+
- **T2: Ambient deduplication** -- `[ RUN ROUTING ]` in Layer 2 and Layer 1 TRACE timeline both show context_fact/divergence items with no node ref; two authoritative surfaces for the same data
|
|
8
|
+
- **T3: State count** -- four independent state dimensions (active tab, overlay open, selected node, right panel loaded) without an explicit state machine; some combinations are illegal (overlay in TRACE tab)
|
|
9
|
+
- **T4: Layer 3 delivery sequencing** -- ghost nodes require `skipped_step` kind not present in `ConsoleExecutionTraceItemKind`; backend change needed before ghost nodes can ship
|
|
10
|
+
|
|
11
|
+
### Real seam
|
|
12
|
+
`useSessionDetailViewModel` owns `selectedNode` and is the right place for `activeTab: 'dag' | 'trace'` per run. Overlay open/close state is transient and local to `RunLineageDag`. Routing content in `NodeDetailSection` would live in the SECTION_REGISTRY.
|
|
13
|
+
|
|
14
|
+
### What makes it hard
|
|
15
|
+
- Overlay must be positioned in scroll-container coordinates and respond to scroll events (node may scroll out of view)
|
|
16
|
+
- `[ N NEW ]` button requires tracking first unread trace index and resetting on scroll
|
|
17
|
+
- Layer 3 edge cause diamonds require computing bezier midpoints of ReactFlow edges
|
|
18
|
+
- Tab strip must live inside `RunLineageDag` header but tab state needs to survive RunCard re-renders
|
|
19
|
+
- Single click currently opens `NodeDetailSection`; Layer 2 overlay would open two simultaneous surfaces from one gesture
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Philosophy Constraints
|
|
24
|
+
|
|
25
|
+
**Make illegal states unrepresentable:** overlay-in-TRACE is illegal; must be structurally prevented, not just runtime-guarded
|
|
26
|
+
**Immutability by default:** routing content should be derived from `(selectedNode, executionTraceSummary)`, not stored in a separate overlay state variable
|
|
27
|
+
**YAGNI with discipline:** overlay positioning infrastructure is non-trivial; requires concrete user need to justify
|
|
28
|
+
**Exhaustiveness everywhere:** tab x overlay x selectedNode transitions must be fully specified
|
|
29
|
+
**SECTION_REGISTRY extension contract:** `NodeDetailSection.tsx:94` was explicitly designed for one-entry additions
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Impact Surface
|
|
34
|
+
|
|
35
|
+
- `NodeDetailSection` SECTION_REGISTRY -- one-entry extension is the intended pattern
|
|
36
|
+
- `useSessionDetailViewModel` `selectedNode` state -- must remain single source of truth; no parallel selection concept
|
|
37
|
+
- `RunLineageDag` scroll container -- overlay positioning and existing tooltip (z-50) share this space; new overlay needs z-60+
|
|
38
|
+
- `CutCornerBox` around RunCard -- `relative` positioning; overflow implications for inner positioned elements
|
|
39
|
+
- `focusNodeInViewport` at `RunLineageDag.tsx:61` -- already handles scroll-to-node; reusable for bidirectional trace navigation
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Candidates
|
|
44
|
+
|
|
45
|
+
### Candidate A: Proposed design as-is (floating overlay, Layer 2)
|
|
46
|
+
|
|
47
|
+
**Summary:** Floating overlay near clicked DAG node shows routing context (`[ WHY SELECTED ]`, `[ CONDITIONS EVALUATED ]`, `[ LOOP ]`, `[ DIVERGENCE ]`); ambient items in `[ RUN ROUTING ]` section visible without node selection.
|
|
48
|
+
|
|
49
|
+
**Tensions resolved:** T1 (spatial anchoring wins -- overlay is adjacent to the node)
|
|
50
|
+
**Tensions accepted:** T2 (ambient items appear in both Layer 2 `[ RUN ROUTING ]` and Layer 1 TRACE timeline), T3 (four state dimensions, state machine unspecified)
|
|
51
|
+
|
|
52
|
+
**Boundary:** `RunLineageDag` internals + new overlay component positioned in scroll-container coordinates (above z-50 tooltip)
|
|
53
|
+
|
|
54
|
+
**Why this boundary:** Spatial relevance requires the overlay to be in the DAG canvas coordinate space
|
|
55
|
+
|
|
56
|
+
**Failure mode:** User clicks node, two surfaces open simultaneously (overlay + right panel). No clear read order. Split-attention cost on every node click. HIGH severity.
|
|
57
|
+
|
|
58
|
+
**Repo-pattern relationship:** Departs. No existing click-triggered spatially-anchored overlay. Tooltip (z-50) is hover-only, not click-triggered.
|
|
59
|
+
|
|
60
|
+
**Gains:** Spatial anchor -- routing context adjacent to the node while it is visually present
|
|
61
|
+
**Gives up:** Click-destination clarity, state machine simplicity, YAGNI, structural prevention of overlay-in-TRACE illegal state
|
|
62
|
+
|
|
63
|
+
**Scope judgment:** Too broad for the click simplicity constraint without resolving the click-destination ambiguity
|
|
64
|
+
|
|
65
|
+
**Philosophy fit:** Conflicts with make-illegal-states-unrepresentable (overlay-in-TRACE can occur without explicit guard), YAGNI (overlay positioning non-trivial)
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### Candidate B: Routing section inside NodeDetailSection (simplest path)
|
|
70
|
+
|
|
71
|
+
**Summary:** Add `routing` and `run_routing` entries to `NodeDetailSection` SECTION_REGISTRY. `routing` section filters `executionTraceSummary.items` by `refs.some(r => r.kind === 'node_id' && r.value === nodeId)`. `run_routing` section shows items with no `node_id` ref (ambient context). No overlay. No new state dimensions.
|
|
72
|
+
|
|
73
|
+
**Data flow:** `NodeDetailSection` receives `executionTraceSummary?: ConsoleExecutionTraceSummary | null` as a new prop. Content derived, not stored. Null guard at one location.
|
|
74
|
+
|
|
75
|
+
**Tensions resolved:** T1 (surface simplicity wins), T2 (ambient items have one primary location -- right panel `run_routing` section), T3 (two state dimensions: selectedNode + activeTab)
|
|
76
|
+
**Tensions accepted:** T1 tradeoff (no spatial anchor -- user reads routing in right panel, not adjacent to DAG node)
|
|
77
|
+
|
|
78
|
+
**Boundary:** `NodeDetailSection.tsx` SECTION_REGISTRY -- one-entry addition, no structural changes elsewhere
|
|
79
|
+
|
|
80
|
+
**Why this boundary:** The SECTION_REGISTRY was explicitly designed for this extension. Zero new infrastructure. The prop addition is backward-compatible (`?` optional).
|
|
81
|
+
|
|
82
|
+
**Failure mode:** Right panel becomes long with many sections on data-rich nodes. The routing section should be collapsible. LOW severity -- manageable.
|
|
83
|
+
|
|
84
|
+
**Repo-pattern relationship:** Follows exactly. SECTION_REGISTRY at line 94 is the intended extension point.
|
|
85
|
+
|
|
86
|
+
**Gains:** Zero new surface logic, zero z-index management, zero click-destination ambiguity. Null guard at one location. One-entry addition consistent with SECTION_REGISTRY contract.
|
|
87
|
+
**Gives up:** Spatial anchor for routing context
|
|
88
|
+
|
|
89
|
+
**Scope judgment:** Best-fit
|
|
90
|
+
|
|
91
|
+
**Philosophy fit:** Honors all principles. Strongest fit.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### Candidate C: Bidirectional TRACE-DAG linking (Layer 2 as navigation bridge)
|
|
96
|
+
|
|
97
|
+
**Summary:** No floating overlay. When a node is selected, a `routingEventCount` badge appears on the DAG tab header ("3 routing events"). In TRACE tab, the first trace entry with a `node_id` ref matching `selectedNodeId` auto-scrolls into view and is highlighted with an amber accent border. TRACE entries with `node_id` refs navigate back to the DAG node via `focusNodeInViewport` on click.
|
|
98
|
+
|
|
99
|
+
**Data flow:** `routingEventCount = executionTraceSummary.items.filter(i => i.refs.some(r => r.kind === 'node_id' && r.value === selectedNodeId)).length`. Derived, not stored. `highlightedTraceIndices` is a derived Set.
|
|
100
|
+
|
|
101
|
+
**Tensions resolved:** T1 (middle path -- no overlay, but navigable bidirectional link), T2 (ambient items only in TRACE tab, no duplication), T3 (two state dimensions + derived sets)
|
|
102
|
+
**Tensions accepted:** T1 tradeoff (routing context requires tab switch; not immediately visible on node click)
|
|
103
|
+
|
|
104
|
+
**Boundary:** RunCard tab header (badge count) + TRACE tab render (highlight) + existing `focusNodeInViewport` reuse
|
|
105
|
+
|
|
106
|
+
**Why this boundary:** Three small wiring points at existing seams. `focusNodeInViewport` at `RunLineageDag.tsx:61` already exists.
|
|
107
|
+
|
|
108
|
+
**Failure mode:** Discovery -- users may not notice the badge count nudge on the DAG tab header and may not know to switch to TRACE to find routing context. MEDIUM severity -- mitigable with stronger visual affordance (e.g., glowing badge).
|
|
109
|
+
|
|
110
|
+
**Repo-pattern relationship:** Adapts. `focusNodeInViewport` reuse is exact. `OverviewRail` RailDot click-to-navigate is a precedent for trace entry navigation.
|
|
111
|
+
|
|
112
|
+
**Gains:** Clean state machine, no ambient duplication, TRACE is canonical routing surface, bidirectional link closes narrative/spatial gap
|
|
113
|
+
**Gives up:** Immediate routing visibility on node click, spatial anchor
|
|
114
|
+
|
|
115
|
+
**Scope judgment:** Best-fit
|
|
116
|
+
|
|
117
|
+
**Philosophy fit:** Honors all principles. Strong fit.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Comparison and Recommendation
|
|
122
|
+
|
|
123
|
+
### Tension matrix
|
|
124
|
+
| Tension | A (overlay) | B (right panel section) | C (bidirectional link) |
|
|
125
|
+
|---|---|---|---|
|
|
126
|
+
| T1 spatial anchoring | Resolved (spatial wins) | Accepted (simplicity wins) | Middle path |
|
|
127
|
+
| T2 ambient deduplication | NOT resolved | Resolved | Resolved |
|
|
128
|
+
| T3 state count | NOT resolved | Resolved | Resolved |
|
|
129
|
+
| T4 ghost nodes | Same for all (backend gate) | Same | Same |
|
|
130
|
+
|
|
131
|
+
### Recommended composite: B + C badge nudge (not A)
|
|
132
|
+
|
|
133
|
+
- **Layer 1 (TRACE tab):** implement exactly as proposed. Zero backend cost, CSS already exists.
|
|
134
|
+
- **Layer 2 (routing for selected node):** Candidate B -- add `routing` section to SECTION_REGISTRY. Resolves T1/T2/T3 simultaneously at the cleanest boundary.
|
|
135
|
+
- **Layer 2 discoverability nudge:** Candidate C badge -- `routingEventCount` on DAG tab header when node is selected. Cheap signal pointing toward TRACE tab.
|
|
136
|
+
- **Layer 3:** edge cause diamonds, loop brackets, CAUSE button -- implement. Ghost nodes gated on backend `skipped_step` confirmation.
|
|
137
|
+
|
|
138
|
+
This preserves the three-layer concept while fixing the weakest element (floating overlay). The overlay is not rejected as wrong -- it is deferred until spatial anchoring is validated as a real user need.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Self-Critique
|
|
143
|
+
|
|
144
|
+
**Strongest counter-argument:** Spatial anchor is real value. In a complex DAG (15+ nodes), looking away to the right panel adds cognitive load. If user research shows this matters, Candidate A is justified.
|
|
145
|
+
|
|
146
|
+
**Pivot conditions:**
|
|
147
|
+
1. User research confirms spatial anchoring reduces debugging time meaningfully -- adopt overlay
|
|
148
|
+
2. Users report confusion about which node's routing context the right panel is showing -- validates spatial disambiguation need
|
|
149
|
+
3. Backend confirms `skipped_step` kind in the same iteration -- changes the Layer 3 cost-benefit calculation
|
|
150
|
+
|
|
151
|
+
**What assumption, if wrong, invalidates this:** If the primary use case is live debugging (not post-run review), spatial immediacy matters more. Ambient context in DAG view is more valuable for live debugging than for post-run analysis.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Open Questions for the Main Agent
|
|
156
|
+
|
|
157
|
+
1. Is the primary use case post-run review or live debugging? This changes whether spatial immediacy matters.
|
|
158
|
+
2. For `[ RUN ROUTING ]` ambient section in Layer 2: if it's dropped in favor of TRACE tab as the sole ambient surface, is there any scenario where a user needs ambient routing context while in DAG mode without wanting to switch tabs?
|
|
159
|
+
3. Was the floating overlay specifically chosen for any reason other than spatial anchoring? (e.g., performance, rendering constraint, user research finding?)
|
|
160
|
+
4. What is the timeline on backend confirmation for `skipped_step` kind?
|