diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V1-complete.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V1-complete.md new file mode 100644 index 000000000..5122801c5 --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V1-complete.md @@ -0,0 +1,91 @@ +# V1 — Global Design-System Foundation (visual-only pass) + +**Scope:** System-level visual polish only. No route, logic, data, feature, markup-text, +or markup-structure changes. Raw `ns-*` class markup preserved (round-trips to Fresh source). +Warm-cream light default + dark both retained. All edits are additive rules appended to +`assets/ns-ext.css` (which loads **last**, after `_ns_styles.css` → `proto.css`, so equal-specificity +overrides of the DS card/panel/shadow rules win legitimately without touching the generated closure). + +**Files touched:** `assets/ns-ext.css` (one appended `V1 — GLOBAL DESIGN-SYSTEM FOUNDATION` block). +`proto.css` not modified — the console page-header size rule already lived there and only needed a +tracking/weight refinement, which the ns-ext override supplies. Markup not modified. + +**Verification:** 16 nav screens × 2 themes = 32 captures, every iteration. `holes[]` and `errors[]` +stayed `[]` on all 32 through the final run. Zero surviving `{{ }}`, zero console errors, in both themes. +Tokens only — no raw hex introduced (the only `rgba()` values are inside shadow/highlight definitions, +matching the DS's own shadow-token convention, e.g. `--ns-shadow-* : … rgba(0,0,0,…)`). + +Final screenshot outdir: +`/tmp/claude-1000/-home-codex-repos-netscript-beta10/cd2ee104-ed45-4ed4-bcca-f960c60a1d84/scratchpad/shots-final` + +--- + +## What changed, and why + +### 1. Signature "press" shadow (biggest lever) +NS One's stated identity is a **hard-offset press shadow**, but the DS shipped generic soft-blur +Material shadows (`--ns-shadow-xs: 0 1px 2px rgba(0,0,0,.05)`), which read as templated. Redefined the +entire shadow ramp (`xs`→`xl`) for **both** themes to a crisp vertical-offset + tight-spread cast so every +surface sits on the canvas with intent. +- **Light:** cast uses the warm ink (`rgba(41,37,33,…)`) at low alpha instead of pure black — sits with + the warm-cream palette instead of graying it. +- **Dark:** deeper offset cast, paired with border + top-highlight (see #3) so raised surfaces read. +- *Before:* cards looked flat/washed, indistinguishable from the page. *After:* cards read as distinct + instrument planes with a subtle lift. + +### 2. Surface language — card + panel +- Radius `--ns-radius-xl` (12px, reads soft/marketing) → **10px** (reads instrument) on `.ns-card`, + `.ns-panel`, and the net-new console cards (`.ns-kpi`, `.ns-assist`, `.ns-incident`, `.ns-statlink`, + `.ns-logstrip`) so hand-built surfaces match the DS card exactly. +- Every card now carries a resting `--ns-shadow-sm/xs` and net-new console cards inherit the same, so the + card grid on Home / Runtime / DLQ reads as a set of planes rather than outlined rectangles. +- Unified interactive feel: `.ns-card--interactive`, `.ns-kpi`, `.ns-stackmap__node` all lift to + `--ns-shadow-md` on hover — one hover language across DS and net-new surfaces. + +### 3. Border presence + dark-mode machined edge +- **Light:** card/panel resting border firmed one notch above the `rgba(0,0,0,.08)` hairline + (`color-mix(border-strong 45%, border)`) so the press shadow lands against a real edge, not a wash. + Calibrated to stay present-but-not-heavy on the cream canvas. +- **Dark:** the baseline borders were near-invisible (`rgba(235,228,210,.06)`) — KPI/stat cards + dissolved into the near-black canvas. Bumped card/panel/kpi/statlink/logstrip borders to + `--ns-border-strong` **and** added a 1px inset top-highlight (`inset 0 1px 0 rgba(235,228,210,.04)`) + so raised surfaces catch a Linear/Vercel-style machined edge. This was the single most visible + dark-mode fix. + +### 4. Typography +- Display headings: tightened tracking to `-0.02em` on `.ns-page-header h1` for a machined feel. +- Console page-header (`--console`, used on the 16 in-shell detail views): `text-2xl` / weight 650 / + `-0.018em` / line-height 1.15 — one clear notch below the marketing h1 but same optical intent. +- Lede: normalized to one size (`--ns-text-sm`), relaxed leading, `max-width: 68ch` — calmer measure, + consistent across screens (was `0.925rem` and running a touch large/loose). +- Mono uppercase micro-labels (KPI labels, log heads, mini-labels, CLI labels, grounding labels) + normalized to `0.09em` tracking so they read as one family instead of drifting per component. + +### 5. Console rhythm + focus +- Three-zone `.ns-console-grid` gutter tightened one step (`space-6`→`space-5`, `space-6` at ≥1440px) + for a denser operator feel without crowding. +- KPI intra-card rhythm tightened (`gap: space-1-5`, value `letter-spacing: -0.01em`) so the number + dominates and the sparkline reads as a footnote — the label+value+delta read as one stat block. +- Standardized focus ring offset to 2px on the net-new interactive rows (`.ns-flowrow`, `.ns-quickcmd`, + `.ns-seg__btn`) that previously used mixed 1px/2px/no-offset. + +--- + +## Deliberately deferred to later per-screen clusters + +These are per-screen or component-internal calls, out of scope for a system-level V1 foundation: + +- **KPI value↔label vertical spacing on Runtime Config** — the big stat numbers ("2 active", "0", …) + sit slightly loose relative to their caption; a per-screen density pass should tune the specific + `ns-kpi`/stat markup on that screen rather than the global token. +- **Waterfall / stackmap internal density** (Run Inspector, Catalog stackmap) — proportional-bar and + node-graph tuning is component-scoped, best done in the component's own cluster. +- **Log-stream / logstrip column widths** — the fixed grid-template columns are content-specific; leave + to the log-surface cluster. +- **Segmented-control + toggle-switch micro-states** — these are DS primitives; any refinement belongs + in a DS-primitive pass, not a consumer-CSS override. +- **Sparkline stroke weights per tone** — legible as-is; a data-viz cluster can calibrate stroke/opacity + per intent color if desired. + +No accessibility, contrast, or hole/error regressions were observed; the foundation holds in both +themes across all 16 nav screens. diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/00-BEFORE-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/00-BEFORE-desktop-light.png new file mode 100644 index 000000000..6fccbccb7 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/00-BEFORE-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/01-desktop-dark.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/01-desktop-dark.png new file mode 100644 index 000000000..ee124afd2 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/01-desktop-dark.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/01-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/01-desktop-light.png new file mode 100644 index 000000000..1c771cd0f Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/01-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/03-mobile-sheet-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/03-mobile-sheet-light.png new file mode 100644 index 000000000..07bf009c5 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/03-mobile-sheet-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/04-desktop-selected-thin.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/04-desktop-selected-thin.png new file mode 100644 index 000000000..66bbce700 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/04-desktop-selected-thin.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/05-desktop-filtered.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/05-desktop-filtered.png new file mode 100644 index 000000000..913300afb Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog-shots/05-desktop-filtered.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog.md new file mode 100644 index 000000000..299702dcb --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V10-catalog.md @@ -0,0 +1,125 @@ +# Pass V10 — Catalog (Service & Contract Registry) + +## Design-question answer (first) + +> *What tailored components, layout, and visualization best showcase THE CATALOG — a browsable +> registry of the contracts this app exposes, each with a kind, a type signature / schema, a version, +> and producer/consumer relationships — and how do they compose?* + +**Answer: a contract registry / explorer, not a monitoring console.** The catalog's job is *browse a +registry → drill into a contract's signature + schema + who uses it*. So the whole screen is a +**two-pane explorer**: a dense, selectable **registry rail** on the left (contracts grouped by kind, +each entry a compact card carrying method glyph + mono `proc` name + a REST/RPC/SDK **duality +tri-pip** + coverage dot + a one-line signature preview), and a **contract detail** on the right that +renders the full **type signature** (mono, type-colored), a **version + compatibility** header, a +secondary **line-numbered schema** block, and a **producers → consumers relationship strip**. Above +both sits a **header composite** of micro-viz (kind distribution channel-bar, coverage ratio meter, +duality-reach tri-meter, version pill) — never plain number cards. Filter chips (kind / method / +coverage) + search make it a real registry toolbar. On mobile the rail stacks and a tapped contract +opens the shared bottom-sheet with the same signature+schema+relationships. + +This idiom is deliberately **distinct** from every finished screen: no precedence waterfall (Config), +no version-arc timeline (Migrations), no fleet triage clusters (DLQ), no live monitoring gauges +(Workers/Sagas/Triggers/Streams). The catalog reads like a **schema/API registry explorer** — mono +signatures, line-numbered schema, a duality matrix, and a producer/consumer graph strip. + +## What I mined, from which reference + +| Reference | What I took | How it's adapted here | +|---|---|---| +| **13-devconsole-c** (schema registry + version diff) | The `Schema Registry > name` **breadcrumb**, the stat strip (CURRENT VERSION / TOTAL / FORMAT / **COMPATIBILITY**), the version dropdown, and the **line-numbered code** panel | Detail header = version tag + **compatibility chip**; schema shown as a **line-numbered signature block** (single, not a giant side-by-side diff — "secondary, not a giant diff" per brief) | +| **11-devconsole-a** (registry table + tabs + detail drawer) | The **registry → right detail drawer** composition, docs sub-tabs, and a compact stat strip | Two-pane browse→detail on desktop; the drawer becomes the **bottom-sheet** on mobile with signature/schema/relationships | +| **07-chat-signin** (browse/detail composition, KV form) | The **calm browse-left / detail-right** rhythm and the labelled KV block | The detail panel's provenance + transport KV rows; unselected empty-state affordance | +| **03-analytics-cards** (wildcard) | Segmented **channel-bar** distribution + ratio meters | Header **kind-distribution channel bar** + **coverage ratio meter** as micro-viz instead of number cards | +| **19-pm-dashboard** (wildcard) | Status-pill dense table + count badges per group | Registry group headers carry a **count + coverage micro-bar**; rows carry inline pips | + +## Component prescription (built) + +| # | Component | Element in reference | Adaptation | +|---|---|---|---| +| 1 | `ns-catreg` registry rail | 11 registry list + 19 grouped rows | Kind-grouped, selectable contract cards; each = method glyph + mono proc + duality tri-pip + coverage dot + signature preview | +| 2 | `ns-catreg__group` | 19 project groups w/ count | Collapsible kind header + count + **coverage micro-bar** (complete vs thin fill) | +| 3 | `ns-catdup` duality tri-pip | (new — schema/transport matrix idiom) | 3 pips REST/RPC/SDK, on/off, tinted teal/copper/amber; also a header **reach tri-meter** | +| 4 | `ns-catsig` signature block | 13 line-numbered code | Line-numbered, mono, **type-colored** type signature (params + return) | +| 5 | `ns-catschema` schema viewer | 13 code panel | Secondary line-numbered JSON-ish schema, muted, scrollable | +| 6 | `ns-catrel` producer→consumer strip | (new — dependency graph idiom) | producers column → contract node → consumers column, connector rail | +| 7 | `ns-cathead` header composite | 13 stat strip + 03 channel-bar/meters | kind-distribution channel bar + coverage ratio meter + duality reach tri-meter + version pill | +| 8 | `ns-catbar` filter toolbar | 11 toolbar (search + dropdowns) | search + kind/method/coverage chips | +| 9 | `ns-catver` version + compat | 13 version dropdown + COMPATIBILITY | version tag + compatibility chip in detail header | +| 10 | Contract bottom-sheet (`sheetIsS4`) | 11 drawer → 06 mobile sheet | Reuses shared `ns-sheet-dialog`: full signature + schema + relationships on mobile | + +## Layout & composition + +Desktop 1440: `header (breadcrumb + title + Contracts/Routes segmented)` → `ns-cathead` composite +(4 micro-viz cells) → `ns-catbar` filter toolbar (search + kind/method/coverage chips) → +`ns-catgrid` two-pane: **registry rail** (`ns-catreg`, grouped selectable cards) + **contract +detail** (`ns-catdetail`: header w/ version+compat → method-strip → line-numbered signature → +line-numbered schema → producer→consumer strip → Scalar action). The Routes tab is a dense +bound/unbound table with a summary chip. + +Responsive: ≤960 the header composite goes 2-col; ≤720 the grid collapses to the rail only and the +detail pane is hidden — tapping a contract opens the shared **bottom sheet** (`sheetIsS4`) with the +full signature + schema + relationships; ≤560 the header cells stack single-column with divider +rules. No horizontal body scroll at any width. + +## Distinctness from finished screens + +- **Not a monitoring console** (Workers/Sagas/Triggers/Streams): no live feed, no runtime gauges, no + status-stream. This is a static registry you *browse and read*. +- **Not the Config waterfall / Migrations arc-timeline / DLQ clusters:** the signature idioms here — + a **duality tri-pip matrix**, **type-colored mono signatures**, a **line-numbered schema**, and a + **producer→consumer connector strip** — appear on no other screen. +- Header micro-viz (kind channel-bar + coverage ratio meter + transport-reach tri-meter) replaces the + old plain warning badges; per density doctrine, zero plain number-card rows. + +## Density notes (per ROLLOUT-DOCTRINE density defaults) + +- No plain number-card stat row — header is a composite of a glyph+value cell + three micro-viz cells. +- Registry cards are compact (≈52px): each earns height with method glyph + proc + signature preview + + duality tri-pip + coverage dot. No 100px padded cards. +- Schema/signature are line-numbered dense mono blocks, not airy bullets; alternating row tint. +- Group headers carry a count + coverage micro-bar (data-bearing, not a ghost divider). +- The gated `crons` group is a slim dashed affordance, not a big empty box. + +## Data model (visual metadata only — fully derived, no route/logic/copy-meaning change) + +`s4Raw` enriches each of the 7 existing contracts with derived visual fields: `ver`, `compat`, +`input`/`output` (→ signature preview), `sig` (tokenized `[text, kind]` cells → type-colored), `schema` +(tokenized `[name, kind, rest]` lines → line-numbered block), `producers`/`consumers` (→ relationship +strip). Derived aggregates: `s4Head` (total, kind distribution, coverage ratio, transport reach), +`s4Groups` (kind-grouped rows + per-group coverage %), `s4Detail` (selected contract). Geometry uses +`--w0..--w20` width-bucket classes (5% steps) — **no SVG `{{ }}` holes**. New state: +`s4Sel`/`s4Kind`/`s4Method`/`s4Cov`/`s4Q`; empty/populated + no-results states all render cleanly. +Existing `s4Contracts`/`s4Routes`/`s4Tree`/`s4Summary` bindings preserved (Tree/Summary now derived +from the same source). `sheetIsS4` reuses the shared `ns-sheet-dialog` (right drawer desktop / bottom +sheet mobile). + +## Verification + +0 `{{ }}` holes / 0 real console errors (only a benign favicon 404) / 0 horizontal overflow across: +desktop 1440 (light+dark), mobile 390 (light+dark), plus interaction states — contract selected +(complete + thin), coverage-filter narrowing (empty groups hidden), Routes tab, and the mobile +bottom-sheet (light+dark). **Full 16-route regression clean** (every nav item: 0 holes, 0 overflow, +0 errors). Edits limited to the S4 Catalog markup, S4 state/bindings/derivation, the `sheetIsS4` +sheet body, and appended `ns-ext.css` — no edits to `support.js`, `_ns_styles.css`, `_ds/*`, or any +other screen's markup. + +## Self-assessment + +- **Bespoke:** 9/10 — the explorer idiom (registry rail + signature/schema/relationship detail) is + unlike any finished screen; only the Routes secondary tab reuses the generic table. +- **Density:** 8.5/10 — compact cards, line-numbered mono blocks, composite header micro-viz, no ghost + rows. Detail pane has some intentional breathing room around the schema block. + +## Honest gaps / declined + +- The **Routes tab** stays a standard dense table (it is the secondary tab; the Contracts explorer + carries the bespoke weight). A future pass could give it a small route→contract binding graphlet. +- The producer/consumer nodes are **non-interactive labels** (deep-linking them to their entities is a + candidate future enhancement; the data has no canonical target ids today, so I did not invent nav). +- Version history is shown as a single `ver`+`compat` chip, **not** a v→v diff viewer (brief said + schema should be "secondary, not a giant diff" — so a single line-numbered block, not the ref-13 + side-by-side). A version dropdown could be added if multi-version data is introduced. +- Signature/schema strings are illustrative visual metadata consistent with each proc's method + + namespace; they are not read from a real type system (this is a static prototype). + diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/00-BEFORE-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/00-BEFORE-desktop-light.png new file mode 100644 index 000000000..f3e84f722 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/00-BEFORE-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-desktop-dark.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-desktop-dark.png new file mode 100644 index 000000000..06c19390e Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-desktop-dark.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-desktop-light.png new file mode 100644 index 000000000..c495abb49 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-mobile-sheet-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-mobile-sheet-light.png new file mode 100644 index 000000000..319131518 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/01-after-mobile-sheet-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/03-revoke-confirm-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/03-revoke-confirm-desktop-light.png new file mode 100644 index 000000000..6dc67b11c Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/03-revoke-confirm-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/04-filter-revoked-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/04-filter-revoked-desktop-light.png new file mode 100644 index 000000000..85fd61f72 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth-shots/04-filter-revoked-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth.md new file mode 100644 index 000000000..6a06e8df9 --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V11-auth.md @@ -0,0 +1,149 @@ +# Pass V11 — Auth Sessions (session-security roster) + +## Design-question answer (first) + +> *What tailored components, layout, and visualization best showcase AUTH SESSIONS — active +> authenticated sessions (who / what device / from where / issued→expires TTL / scopes / status) +> that an operator inspects and can revoke — and how do they compose?* + +**Answer: a session-security console, not a table.** An operator's job here is *scan who is +authenticated → judge risk (how long is this token still valid, does it hold elevated scope, is it +MFA-backed, where from) → drill into one session → revoke it.* So the whole screen is a **security +roster**: identity-forward **session cards** (avatar + device glyph + provider + geo + a live +**TTL/expiry countdown bar** + scope chips + status), fronted by a **security header composite** +whose signature element is an **expiry-horizon strip** (soonest-to-expire ordering), and drilling +into a card opens a **session detail** panel with a **TTL lifespan visualization** (elapsed-hatch vs +remaining-fill with a *now*-marker), an identity/device/geo KV block, granted scopes, and a +**session-lifecycle timeline** — with **Revoke** (per-session) and a gated **Revoke all**. On mobile +the detail is the shared **bottom sheet**. + +The screen-owning idiom is **time-to-live**: nothing else in the app expresses a lifespan. Every +session carries a remaining-vs-elapsed bar and a countdown; the header orders live sessions by how +soon they die. That makes Auth visually **distinct** from every finished screen — not the live +monitoring gauges of the consoles, not the Config precedence waterfall, not the Migrations version +arc, not the DLQ error-signature clusters, not the Catalog registry rail. It reads like a +**security/session console** (identity avatars, TTL meters, scope chips, revoke) that appears nowhere +else. + +## What I mined, from which reference + +| Reference | What I took | How it's adapted here | +|---|---|---| +| **07-chat-signin** (identity / principal treatment) | The circular identity glyph + the provider sign-in affordance (Apple/Google) | Session cards lead with an **initials avatar** + a **device-glyph badge**; the provider becomes a tinted **`ns-authprov` chip** (oidc·workos / password / api-key). **Rejected the ref's raw green** — used NS copper (human) / teal (service) / amber, per the hard rule. | +| **19-pm-dashboard** (Mondays) | The rounded **stat-pill strip**, the **status pills** (In Progress/Pending/Completed), the avatar treatment, and the **day-strip** rhythm | Status → **`ns-badge` tones** (active=success / idle=warning / expiring=destructive / revoked=muted); the pill-strip idea became the **header composite**; the day-strip's ordered horizontal rhythm became the **expiry-horizon strip** (one row per live session, ordered by remaining). | +| **11-devconsole-a** (Kafka console: stat strip + table + right detail drawer) | The **stat strip → dense list → right-side detail DRAWER** composition and the search+filter toolbar | Two-pane **roster + detail** on desktop; the drawer becomes the **bottom sheet** on mobile; the toolbar = search + status filter chips + sort segmented. | +| **04-finance-cards** (wildcard — elapsed/segmented meters) | Segmented horizontal meters with a value marker | The **detail TTL lifespan track**: hatched elapsed + toned remaining + a **now-marker** positioned at the elapsed boundary (width-bucketed). | +| **03-analytics-cards** (wildcard — channel bar + ratio meters) | Segmented distribution channel-bar + ratio meters | Header **status-distribution channel bar** (click-to-filter) + **elevated-scope** and **MFA-coverage** ratio meters — replacing plain number cards. | + +## Component prescription (built) + +| # | Component | Element in reference | Adaptation | +|---|---|---|---| +| 1 | `ns-authcard` session card | 07 identity glyph + 19 status-pill row | Avatar + device-glyph badge + name + elevated flag + uid/email + provider chip + geo + MFA + status badge + TTL bar + scope-chip footer + revoke; left status rail | +| 2 | `ns-ttlbar` live TTL bar | 04 segmented meter | Per-card remaining-fill, tone by urgency; **hatched** when expiring (≤12%); width-bucket geometry | +| 3 | `ns-authttl` lifespan viz | 04 elapsed/marker meter | Detail: hatched **elapsed** vs toned **remaining** + a **now-marker** at the elapsed boundary + issued/TTL/expiry labels | +| 4 | `ns-authhead` header composite | 19 stat-strip + 03 channel-bar/meters | glyph+count hero + status channel bar + legend + elevated-scope meter + MFA-coverage meter + expiry-horizon strip | +| 5 | `ns-authhz` expiry-horizon strip | 19 day-strip rhythm | Live sessions ordered soonest→latest; per-row track + countdown; click selects; the **signature** header viz | +| 6 | `ns-authchan` status channel bar | 03 segmented channel bar | active/expiring/idle/revoked segments, click-to-filter, tone-colored | +| 7 | `ns-authratio` ratio meter | 03 ratio meter | Elevated-scope % and MFA-coverage % gradient fills (amber→destructive / teal) | +| 8 | `ns-authbar` roster toolbar | 11 search + filters | search + status filter chips (`ns-authbar__chip`) + sort segmented (soonest expiry / by status) | +| 9 | `ns-authdetail` detail panel | 11 right drawer | identity header + TTL viz + KV block + scopes + lifecycle timeline + revoke; sticky | +| 10 | `ns-authtl` lifecycle timeline | 11 detail history (+ DLQ step-timeline idiom) | tone-dotted compact steps: issued → refresh/idle → revoked | +| 11 | `ns-scopechip` scope chips | (new — RBAC idiom) | elevated (admin/deploy/write) tinted copper vs muted read | +| 12 | `sheetIsS15` bottom sheet | 11 drawer → 06 mobile sheet | Reuses shared `#ns-sheet-dialog`: full identity + TTL + KV + scopes + timeline + revoke on mobile | +| 13 | `ns-auth__now` + `Revoke all` | 11 "Connected" env pill + toolbar action | live server-clock chip (pulsing dot) + gated destructive **Revoke all N** | + +## Layout & composition + +Desktop 1440: `header (title + lede + now-clock + Revoke all)` → **`ns-authhead`** composite (hero +count + status channel bar + elevated meter + MFA meter + expiry-horizon strip) → **`ns-authbar`** +toolbar (search + filter chips + sort segmented) → **`ns-authgrid`** two-pane: **roster** +(`ns-authcard` list, sorted soonest-expiry or by-status) + **detail** (`ns-authdetail`: identity +header → TTL lifespan viz → KV → scopes → lifecycle timeline → revoke) → **`ns-authstream`** +two-column auth.* event feed. + +Responsive: ≤1180 the header composite goes 2-col; ≤900 the grid collapses to the roster only and +the detail pane hides — tapping a card opens the shared **bottom sheet** (`sheetIsS15`) with the full +identity/TTL/KV/scopes/timeline/revoke; ≤640 the header stacks single-column, cards reflow (avatar + +identity top, then a full-width status+TTL+countdown row, then scopes + revoke), the toolbar wraps, +the stream goes single-column. No horizontal body scroll at any width. + +## Distinctness from finished screens + +- **Not a monitoring console** (Workers/Sagas/Triggers/Streams): no live runtime gauges, no + status-stream monitoring. This is an identity/session **security** view. +- **Not** the Config precedence waterfall, the Migrations version-arc timeline, the DLQ + error-signature clusters, or the Catalog registry rail. The idioms unique to Auth — an + **identity avatar + device glyph**, a **per-row live TTL countdown bar**, a **soonest-to-expire + horizon strip**, a **lifespan elapsed/now/remaining track**, **scope chips**, and a **revoke** + flow — appear on no other screen. +- Header micro-viz (status channel bar + elevated/MFA ratio meters + expiry-horizon) replaces the + old plain table caption; per density doctrine, zero plain number-card rows. + +## Density notes (per ROLLOUT-DOCTRINE density defaults) + +- **No plain number-card stat row** — the header is a composite: glyph+count hero + channel bar + + two ratio meters + a per-session horizon strip. +- **Compact cards** (~110px incl. footer): each earns height with avatar + device + provider + geo + + MFA + status + TTL bar + countdown + scope chips + revoke — no padded 3-line boxes. +- **Dense KV + timeline**: mono, alternating-tint KV rows; a compact tone-dotted lifecycle timeline, + not airy bullets. +- **No ghost rows**: the empty/no-match state is a single centered affordance with a Clear-filters + action, not a big dashed box; revoked sessions dim + carry a slim revoked-note, not an empty gap. + +## Data model (visual metadata only — fully derived, no route/logic/copy-meaning change) + +`s15Raw` enriches the session projection with **derived visual fields**: `dev`/`agent` (device + +user-agent), `ip`/`loc`/`geo`, `issued`/`expires`/`ttlFrac`/`lifespan` (→ TTL bars + lifespan viz), +`scopes` + `elevated` (→ scope chips + elevated meter), `mfa`, `corr`. The original three sessions +(usr_31 / usr_18 / usr_07) are preserved in meaning (same ids, provider, state, started time, last +event text) and enriched; two more sessions (usr_44 idle, svc_52 service/expiring) are added so the +roster is **dense** and exercises every status (active / idle / expiring / revoked / service) — the +prototype data was already illustrative. Derived aggregates: `s15Head` (active/live counts, status +distribution, elevated %, MFA %, expiry horizon), `s15Detail` (selected session KV + lifecycle +timeline). Geometry uses `--w0..--w20` width-bucket classes (5% steps) — **no SVG `{{ }}` holes**. +New state: `s15Sel`/`s15Filter`/`s15Sort`/`s15Q`. `sheetIsS15` reuses the shared `#ns-sheet-dialog` +(right drawer desktop / bottom sheet mobile via `matchMedia(640px)`). Revoke + Revoke-all reuse the +shared `askConfirm` → `#ns-confirm-dialog` flow with the correct `netscript auth sessions revoke` +CLI. The `authFeed` (auth.* event stream) is preserved verbatim. + +> **`sc-if` has no `negate`** (the engine's `walkIf` only checks `value` truthiness). Empty-state and +> revoked-note branches are gated on inverted bindings (`s15NoResults`, `s15Detail.cannotRevoke`) +> instead — verified rendering both branches correctly. + +## Verification + +0 `{{ }}` holes / 0 real console errors (only the benign favicon 404) / 0 horizontal overflow across: +desktop 1440 (light+dark), mobile 390 (light+dark), plus interaction states — session selected +(Analytics Sync expiring @3%, Maya active/elevated @50% — **now-marker verified at the correct +elapsed boundary** across life stages), **revoke confirm** (light+dark, correct `sess_52 → revoked` + +CLI), **mobile revoke-all confirm**, the **mobile bottom sheet** (light+dark), the **Revoked filter**, +and the **empty/no-match** state. **Full 16-route regression clean** (every nav item: 0 holes, 0 +overflow, 0 errors — no other screen changed). Edits limited to the S15 Auth markup, the S15 +state/derivation/bindings, the `sheetIsS15` sheet body + `sheetTitle` case, and appended `ns-ext.css` +— no edits to `support.js`, `proto.css`, `_ds/*`, or any other screen's markup. + +## Self-assessment + +- **Bespoke:** 9/10 — the session-security idiom (identity avatars + live TTL countdown bars + + soonest-to-expire horizon + lifespan track + scope chips + revoke) is unlike any finished screen; + only the auth.* event stream reuses the generic `ns-activity-feed` (intentionally — it is the + secondary strip and its copy is preserved verbatim). +- **Density:** 8.5/10 — composite header micro-viz, compact multi-metadata cards, dense KV + timeline, + no ghost rows, click-to-filter distribution. The detail panel keeps a little intentional breathing + room around the lifespan viz and the revoke CTA. + +## Honest gaps / declined + +- The **auth event stream** stays a standard (two-column) `ns-activity-feed`. It is a real, + copy-locked data strip; giving it a bespoke treatment risked changing its meaning, so I kept it and + spent the bespoke budget on the roster + TTL viz. +- Session **avatars are initials**, not photos (the projection has no avatar URLs; inventing image + assets would exceed "visual metadata only"). The device glyph + kind-tone carry identity instead. +- **TTL is a static snapshot** at the app clock (14:02:11) — the bars express elapsed/remaining but + do not tick live (the prototype has no animation loop for it; a `requestAnimationFrame` countdown + is a candidate future enhancement). +- Device / geo / IP / scope values are **illustrative visual metadata** consistent with each + session's provider and kind; they are not read from a real auth backend (static prototype). +- "Open in Aspire" on the detail is a placeholder affordance (no canonical Aspire session resource to + deep-link to today). diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-fix.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-fix.md new file mode 100644 index 000000000..e5d666e0b --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-fix.md @@ -0,0 +1,101 @@ +# Pass V12-fix — Extensions density tighten + +**Scope:** VISUAL + LAYOUT ONLY. No route/logic/data/copy-meaning change. The bespoke +contribution-manifest idiom (provider roster + surface-grouped manifest + Surfaces lanes + +Available) is KEPT — this pass only removes the density looseness the adversarial vision gate +(58/100) flagged. The gate's table-conversion / avatar / version-timeline prescriptions were +DECLINED (they would echo the consoles, or invent data that does not exist). + +Files touched: +- `render/prototype.dc.html` — Surfaces lane markup (added header meter + mount summary + slim + footer, split mount-card into a single meta/perm row); CONTRIBUTES row markup (`__meta` → + `__path` chip); `extLanes` JS enriched with `shareWClass` / `mountSummary` / `foot` (derived + from existing counts — no new data). +- `render/assets/ns-ext.css` — appended a `V12-fix — DENSITY PASS` block that overrides the loose + rules by cascade order. All rules scoped under `.ns-ext*`. + +## What changed, by the 5 asks + +### 1. Compact provider roster cards (`ns-extprov`) +- Vertical padding `space-2-5` → `7px` top/bottom; internal `__main` row gap `space-2` (8px) → `3px`. +- Left icon gutter tightened: glyph `2.1rem` → `1.75rem`, column gap `space-3` → `space-2-5`. +- Roster inter-card gap `space-2-5` → `space-2`. +- **Card height 88px → 59px (−33%).** The three rows (name+status / micro-bar / pips+source) now + hug each other; every row still carries real content, none is padding. + +### 2. Slim per-provider contribution micro-bar (`ns-extprov__contribbar`) +- Height `.5rem` (8px) → **4px**, dropped the track background + inset border so it reads as a slim + segmented rule sitting directly under the name. Copper=panel / teal=command / amber=tool kept; + a faint per-segment inset keeps segments legible at 4px. + +### 3. Densify the manifest CONTRIBUTES section (`ns-extmanifest`) +- Each contribution is now a **~44px row**: surface glyph + bold name + an inline **path chip** + (the mount path, tinted to the surface colour, ellipsised) + right-aligned perm. Title + path + sit on one line (`nowrap`, `min-width:0`) so rows stay at 44px instead of wrapping to ~64px. +- Group header is now **sticky** (slim, uppercased, `top:0` with a light backdrop blur) so the + surface grouping stays anchored while the list scrolls. +- KV grid row padding `space-1-5` → `space-1`; manifest section gaps tightened + (`gap` `space-3-5`→`space-3`, groups `space-2-5`→`space-2`). + +### 4. Tighten the top stat composite (`ns-exthead`) +- Cell padding `space-4/space-5` → `space-3/space-3-5`; cell gap `space-2-5` → `space-2`. +- Hero glyph `2.75rem` → `2.25rem`, hero number `3xl` → `2xl`. +- Channel bar height `1.5rem` → `1.25rem`; compat alert padding `space-2-5` → `space-2`. +- **Micro-viz preserved** — the contributions-by-surface segmented bar (click-to-filter), the + enabled-coverage meter, the tier chips, and the compatibility alert are all intact, just denser. + +### 5. Fix the Surfaces uneven-lane whitespace (`ns-extlane`) +Root cause: three equal `auto-fit` columns in one grid row with `align-items:start`; the 6-item +Panels lane (649px) forced the row band tall while the two 2-item lanes (277px each) left ~372px +empty below → a big empty lower-right region. + +Fix — **2-column independent-height layout**: +- Panels lane spans the **left column** (`grid-row: 1 / span 2`, `minmax(0,1.35fr)`). +- Commands lane (row 1) and AI-tools lane (row 2) **stack in the right column** (`minmax(0,1fr)`). +- Each lane gained a **header stat**: a slim 4px share meter (fill ∝ contribution count, surface + colour) + a monospace **mount summary** (`capabilities/* · data/*`, `⌘K palette`, `AI runtime`). +- Each lane gained a **slim dashed footer**: `↳ N from M provider(s)` (derived from the + real per-lane counts). +- Mount-cards densified: path + perm collapsed onto one `space-between` row; per-lane redundant + description paragraph hidden (the header meter + mount summary now carry that signal). + +Result: right column height (256 + 256 + gap ≈ **525px**) now matches the Panels lane (**520px**), +so the two columns bottom-align. The empty region shrank from **~372px → ~5px**. Mobile ≤720px +collapses all three lanes to a single stacked column. + +## Verification + +Measured via Playwright (Chromium 1232), `deviceScaleFactor: 2`, live harness +`http://127.0.0.1:8899/prototype.dc.html`. + +| Metric | Before | After | +|---|---|---| +| Provider card height | 88px | **59px (−33%)** | +| Contribution micro-bar height | 8px | **4px** | +| CONTRIBUTES row height | ~64px (wrapping) | **44px** | +| Surfaces empty lower-right | ~372px | **~5px** | +| Panels lane vs right column | 649 vs (277+277) split | **520 vs 525 (aligned)** | + +Gates (all views × 1440 + 390 × light + dark): +- **Zero `{{ }}` holes** — Providers, Surfaces, mobile sheet all 0. +- **Zero console errors** — (the single 404 is a pre-existing unrelated favicon/resource fetch, + present before this pass). +- **Zero horizontal overflow** — 22/22 checks false (3 views × 2 themes × 2 viewports + sheets). +- **16-route regression clean** — every sidebar route: 0 overflow, 0 holes, 0 errors. Appended CSS + is scoped under `.ns-ext*` and did not leak. + +Shots (overwritten in `render/_visual-reports/V12-ext-shots/`, `00-BEFORE-*` retained for compare): +Providers / Surfaces / Available × desktop 1440 + mobile 390 × light + dark, a provider selected +(triggers, both themes), and the mobile manifest bottom sheet (both themes). + +## Honest gaps +- The roster cards have visible empty space to the *right* of the 4px micro-bar (the bar spans full + width but the pips/source row is short); this is intentional breathing room, not dead space, and + keeps the card from echoing a table. Could be filled with a right-aligned mount-count chip in a + future pass if the gate still flags it. +- The Surfaces 2-column split assumes the Panels lane stays the tallest (it holds 6 of 10 + contributions). If the data shifted so Commands/AI-tools out-grew Panels, the right column could + exceed the left; the `grid-row` placement is keyed to `data-kind` so it degrades gracefully + (short lanes just leave a little space) rather than overflowing. +- CONTRIBUTES path chips ellipsise very long mount paths on narrow manifest widths; the full path + remains in the KV grid / mount map, so no information is lost, but the chip itself truncates. diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/00-BEFORE-panels-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/00-BEFORE-panels-desktop-light.png new file mode 100644 index 000000000..e56ac11f4 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/00-BEFORE-panels-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/01-providers-desktop-dark.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/01-providers-desktop-dark.png new file mode 100644 index 000000000..0b3b7319c Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/01-providers-desktop-dark.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/01-providers-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/01-providers-desktop-light.png new file mode 100644 index 000000000..dd64a2871 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/01-providers-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/04-surfaces-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/04-surfaces-desktop-light.png new file mode 100644 index 000000000..217654564 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/04-surfaces-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/06-available-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/06-available-desktop-light.png new file mode 100644 index 000000000..201a1b207 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/06-available-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/09-mobile-sheet-manifest-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/09-mobile-sheet-manifest-light.png new file mode 100644 index 000000000..03dbe7da4 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext-shots/09-mobile-sheet-manifest-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext.md new file mode 100644 index 000000000..5c50eb01b --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-ext.md @@ -0,0 +1,153 @@ +# Pass V12 — Extensions (contribution-manifest console) + +## Design-question answer (first) + +> *What tailored components, layout, and visualization best showcase EXTENSIONS — the installed +> add-ons that extend the app/runtime, each with what it CONTRIBUTES (the surfaces/capabilities it +> adds), a version + source, an enabled/disabled status, and config — and how do they compose?* + +**Answer: a contribution manifest, not an app-store grid.** An extension here is a *provider* — a +plugin that mounts contributions into named host **surfaces** (UI panels/routes, ⌘K commands, AI +tools). The operator's job is *see who is installed → understand WHAT each one adds and WHERE it +plugs in → judge trust + version/contract compat → drill into one extension's full manifest → +enable/disable it.* So the screen is a **provider roster + contribution manifest**, and the +screen-owning idiom is the **contribution surface**: every extension carries a per-row +**contribution bar** (a stacked mini-bar whose segments are colored by surface kind — copper=panel, +teal=command, amber=tool) plus surface **pips** ("+2 panels · +2 cmds"), and selecting one opens a +**manifest** that groups its contributions by surface, shows a **"plugs into"** mount map, and gates +enable/disable. Three composable views share one header: **Providers** (roster + manifest), +**Surfaces** (the cross-cut — three tinted lanes listing every contribution mounted into +Panels/Commands/AI-tools with provenance), and **Available** (install/quarantine with a +**contract-compatibility meter**). + +The idiom nothing else in the app uses: **surface-typed contribution shape** (copper/teal/amber +segments) + a **surface-grouped manifest** + a **"plugs into" mount map** + a **built-for-vs-host +contract meter**. That makes Extensions visually **distinct** from every finished screen — not the +console monitoring gauges, not the Config precedence waterfall, not the Migrations version arc, not +the DLQ error-signature clusters, not the Catalog registry rail, not the Auth TTL/identity roster. + +## What I mined, from which reference + +| Reference | What I took | How it's adapted here | +|---|---|---| +| **21-flow-builder** (outamate node-graph + **component palette** Text/Image/Gallery/Button) | The idea that nodes CONTRIBUTE into a canvas, plus the tinted **category-tile palette** and the right **properties panel** | The palette became the **surface-kind colour system** (copper/teal/amber per contribution kind) and the **Surfaces lanes**; the right properties panel became the **manifest detail pane**. The "what does this node add" framing is the whole screen's spine. | +| **11-devconsole-a** (Kafka console: stat strip → dense list → right detail DRAWER) | The **stat strip → roster → right-side detail drawer** composition + the filter toolbar | Two-pane **roster + manifest** on desktop; the drawer → shared **bottom sheet** on mobile; the toolbar became the **surface-kind filter chips** (`ns-extbar`). | +| **19-pm-dashboard** (Mondays) | The rounded **stat-pill strip**, **status pills** (In Progress/Pending/Completed), grouped table cards | The pill-strip idea became the **header composite**; status → enabled/disabled **status dots**; the grouped-table rhythm became the **contribution groups** inside the manifest. | +| **07-chat-signin** (card composition) | Clean card head (glyph + title + meta) + a footer action row — **but rejected the raw green/blue buttons** | Provider rows + available cards use a glyph + name + meta head and a gated CTA in **NS copper/teal/amber**, never generic SaaS green/blue (per hard rule). | +| **03-analytics-cards** (wildcard — channel bar + ratio meters) | Segmented **channel bar** + **ratio meters** | Header **surface-distribution channel bar** (click-to-filter) + **enabled-coverage ratio meter**, replacing plain number cards. | +| **04-finance-cards** (wildcard — elapsed/segmented meter w/ marker) | Segmented meter with a value marker | The Available **contract-compatibility meter**: built-for fill (teal if ==host, amber if behind) + a **host "now" marker** at the right edge. | + +## Component prescription (built) + +| # | Component | Element in reference | Adaptation | +|---|---|---|---| +| 1 | `ns-exthead` header composite | 19 stat-strip + 03 channel/meters | glyph+count hero + surface channel bar + enabled ratio meter + tier chips + **compat alert** — no plain number cards | +| 2 | `ns-extchan` surface channel bar | 03 segmented channel bar | panels/commands/tools segments (copper/teal/amber), width ∝ count, **click-to-filter** the roster | +| 3 | `ns-extratio` enabled meter | 03 ratio meter | enabled-coverage fill; turns copper when any disabled, with a live count foot | +| 4 | `ns-extcompat` compat alert | 11 "Connected" env pill (inverted → warning) | quarantine/held summary + host-contract chip | +| 5 | `ns-extbar` surface filter chips | 11 search + filters | all / Panels / Commands / AI-tools chips (tinted-active), provider count | +| 6 | `ns-extprov` provider row | 21 node "what it adds" + 07 card head | glyph (tier) + name + version + status dot + **contribution bar** + surface **pips** + source; left status rail; the roster unit | +| 7 | `ns-extprov__contribbar` contribution bar | 21 palette-tinted segments | the **signature** per-row viz: stacked segments colored by surface kind, width ∝ count | +| 8 | `ns-extmanifest` manifest pane | 21 properties panel / 11 drawer | identity head + KV (source/version/tier/contract/contributes) + **contribution groups** + **plugs-into** + gated toggle; sticky desktop → bottom sheet mobile | +| 9 | `ns-extgroup` contribution group | 19 grouped table + 21 palette | contributions grouped by surface kind, tinted header + per-item mount target + perm | +| 10 | `ns-extmounts` "plugs into" map | 21 canvas mount points | tinted chips (capabilities/* · data/* · ⌘K palette · AI runtime) — the mount surfaces this ext touches | +| 11 | `ns-extlane` surface lane | 21 palette columns / 11 lanes | Surfaces view: 3 tinted lanes (Panels/Commands/AI-tools) each listing every contribution + provenance chip + perm | +| 12 | `ns-extmount-card` mount card | 11 dense list row | per-contribution card inside a lane: icon + title + **provider chip (tier)** + mount + perm | +| 13 | `ns-extcompatbar` contract meter | 04 elapsed/marker meter | built-for fill (teal ok / amber behind) + host "now" marker; the version-drift story | +| 14 | `sheetIsS16` bottom sheet | 11 drawer → 06 mobile sheet | reuses shared `#ns-sheet-dialog`: full manifest (identity + KV + groups + plugs-into + toggle) on mobile | + +## Layout & composition + +Desktop 1440: `header (title + lede + Providers/Surfaces/Available segmented)` → **`ns-exthead`** +composite (count hero + surface channel bar + enabled meter + tier chips + compat alert). Then per +view: **Providers** = `ns-extbar` filter chips → **`ns-extgrid`** two-pane (roster of `ns-extprov` +rows + sticky `ns-extmanifest`); **Surfaces** = **`ns-extlanes`** three tinted lanes; **Available** = +**`ns-extavail`** cards with the contract meter. + +Responsive: ≤1180 the header composite goes 2-col; ≤1023 the grid collapses to the roster only and +the manifest hides — tapping a provider opens the shared **bottom sheet** (`sheetIsS16`) with the +full manifest; ≤720 the header stacks single-column, lanes/available go single-column, rows reflow. +No horizontal body scroll at any width. + +## Distinctness from finished screens + +- **Not a monitoring console** (Workers/Sagas/Triggers/Streams): no runtime gauges or status stream. +- **Not** the Config waterfall, Migrations version arc, DLQ clusters, Catalog rail, or Auth + TTL/identity roster. The idioms unique to Extensions — a **surface-typed contribution bar**, a + **surface-grouped manifest**, a **"plugs into" mount map**, and a **built-for-vs-host contract + meter** — appear on no other screen. +- Header micro-viz (surface channel bar + enabled ratio meter + tier chips + compat alert) replaces + the old airy 3-column KV grid; per density doctrine, zero plain number-card rows and no dead region. + +## Density notes (per ROLLOUT-DOCTRINE density defaults) + +- **No plain number-card stat row** — the header is a composite (count hero + click-to-filter channel + bar + ratio meter + tier chips + compat alert). +- **Compact rows** — each `ns-extprov` earns its height with glyph + name + version + status + + contribution bar + pips + source (no padded 3-line card). +- **Dense manifest** — alternating-tint KV, tinted contribution groups with per-item mount+perm, and + a compact mount-chip map, not an airy scroll. +- **No ghost rows** — the old huge empty region below the 6 cards is gone; the two-pane grid + lanes + fill the viewport. Disabled providers dim + carry a gray rail, not an empty gap. + +## Data model (visual metadata only — no route/logic/copy-meaning change) + +The original `extPanels` / `extActions` arrays (ids, mounts, slots, tiers, perms, toggle flows, CLIs, +copy) are **preserved verbatim**. Derived on top: `extContribs` tags every panel/action with a +surface **kind** (panel/command/tool); `extProviders` **groups contributions by plugin** (the +extension) and derives the contribution bar (`extWCls` width buckets), pips, byKind counts, and an +enabled flag (a provider is disabled only when all its panels are disabled — driven by the existing +`extDisabled` map). `EXTMETA` adds illustrative **version + source** per plugin (consistent with +first-party tier); `buildManifest` assembles the KV, surface-grouped contribution list, and the +"plugs into" mount set. `extHead` derives the header aggregates; `extSurfChips` the roster filter; +`extLanes` the Surfaces cross-cut; `extAvailable` enriches the two available entries with a +contract-compat fraction + adds-pips (copy/CLIs untouched). New state: `extSel` (selected provider), +`extSurf` (surface-kind roster filter). The segmented tabs reuse the existing `extTab` query param +(Providers=panels / Surfaces=actions / Available=available), so routing + deep-links are unchanged. +`sheetIsS16` reuses the shared `#ns-sheet-dialog` (right drawer desktop / bottom sheet mobile via +`matchMedia(900px)`). Enable/disable + install/quarantine reuse the shared `askConfirm` → +`#ns-confirm-dialog` flow with the correct `netscript plugin …` CLIs. Geometry uses shared +`--w0..--w20` width-bucket classes (`--wpct`/`--wnum`) — **no SVG `{{ }}` holes**. + +## Verification + +0 `{{ }}` holes / 0 real console errors (only the benign favicon/resource 404) / 0 horizontal +overflow across: **Providers** (desktop 1440 light+dark, mobile 390 light), **Surfaces** (desktop +light+dark, mobile), **Available** (desktop light+dark, mobile), plus interaction states — provider +**selected** (triggers manifest: 2 panels + 2 commands grouped, plugs-into capabilities/* · data/* · +⌘K), **surface-kind filter** (Commands chip → roster narrows to triggers, teal-active, count +updates), tool-only provider (runtime-config manifest), the **disable confirm** (light+dark, correct +`sagas.console = enabled → disabled` + `netscript plugin disable sagas`), the resulting **disabled +state** (row dims + gray rail, header meter → "5 enabled · 1 disabled", manifest → Enable, toast), +and the **mobile bottom sheet** (light+dark). **Full 16-route regression clean** in **both themes** +(every nav item: 0 holes / 0 overflow / 0 errors — no other screen changed). Edits limited to the +S16 Extensions markup, the S16 derivation/bindings, the `sheetIsS16` sheet body + `sheetTitle`/sheet +wiring, and appended `render/assets/ns-ext.css` — no edits to `support.js`, `proto.css`, `_ds/*`, or +any other screen's markup. + +## Self-assessment + +- **Bespoke:** 9/10 — the contribution-manifest idiom (surface-typed contribution bar + + surface-grouped manifest + plugs-into mount map + built-for-vs-host contract meter + tinted + Surfaces lanes) is unlike any finished screen. Only the confirm dialog + bottom-sheet chrome reuse + the shared kit (intentionally, for consistency). +- **Density:** 8.5/10 — composite header micro-viz, compact multi-metadata rows, dense grouped + manifest, tinted lanes, click-to-filter; the old dead region is gone. The single small soft spot is + the transient filtered state where the roster narrows to one provider (left column shorter than the + tall manifest) — acceptable for a filter view; the default "all" state fills both columns. + +## Honest gaps / declined + +- **Version + source** (`v2.4.0`, `netscript`) are illustrative visual metadata consistent with each + plugin's first-party tier — not read from a real registry (static prototype). The **contract "v2 · + compatible"** line and the Available built-for-v1/v2 values likewise dramatize the quarantine story + the original copy already told. +- The extension **detail route** `/extensions/:extensionId` still exists and is wired via the + original per-panel `open`; the manifest's primary drill is the in-page pane / bottom sheet + (`extSel`). The panel `nav('/extensions/…')` deep-link is preserved but not the primary affordance. +- Provider "**config**" is represented by the manifest KV + slots/perm metadata and the enable/disable + toggle — there is no free-form config editor (the prototype exposes none; inventing one would exceed + "visual metadata only"). +- In the **filtered** Providers view, if the currently-selected provider is filtered out the manifest + falls back to the first visible provider — correct, but means the manifest can change when you + toggle a filter chip. Intentional (keeps the pane populated), noted for transparency. diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/available-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/available-desktop-light.png new file mode 100644 index 000000000..268374e26 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/available-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/available-mobile-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/available-mobile-light.png new file mode 100644 index 000000000..d6e640dda Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/available-mobile-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/provider-selected-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/provider-selected-desktop-light.png new file mode 100644 index 000000000..ab90ebd42 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/provider-selected-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/provider-selected-mobile-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/provider-selected-mobile-light.png new file mode 100644 index 000000000..0176e4306 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/provider-selected-mobile-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-desktop-dark.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-desktop-dark.png new file mode 100644 index 000000000..eacf6101e Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-desktop-dark.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-desktop-light.png new file mode 100644 index 000000000..7df8d7576 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-mobile-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-mobile-light.png new file mode 100644 index 000000000..e91f9e3c8 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/providers-mobile-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/surfaces-desktop-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/surfaces-desktop-light.png new file mode 100644 index 000000000..e1621f96e Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/surfaces-desktop-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/surfaces-mobile-light.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/surfaces-mobile-light.png new file mode 100644 index 000000000..ca981e641 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix-shots/surfaces-mobile-light.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix.md new file mode 100644 index 000000000..3f581c8de --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-refix.md @@ -0,0 +1,114 @@ +# V12 Extensions — component rethink + +## Design question + +*"What tailored components, layout, composition, data-visualization, and data-structure best showcase +EXTENSIONS — installed add-ons that mount contributions into host surfaces — and how do they compose?"* + +Extensions should read as a registry and mount map, not a metrics dashboard. The composition starts +with one compact inventory summary whose only visualization is the legitimate contribution-by-surface +proportion. Providers are selectable records with explicit columns for identity, version, +contributions, trust, source, and status; selection opens a manifest assembled from grouped +contribution rows. Surfaces invert that same data into three host-surface record groups, each with a +count and mount context. Available extensions are install-candidate records with categorical +contract facts, contribution tags, hold state, and action. Together these components express the +real relationship: providers contribute discrete items, and host surfaces receive those items. + +The reference lineage is component-level: `11-devconsole-a.png` supplies the contiguous summary rail +and dense records rhythm; `19-pm-dashboard.png` supplies compact status-bearing rows; and +`21-flow-builder.webp` supplies the provider-to-host mental model while avoiding invented graph +connectors. The colored segmented surface split is the single signature. Everything else is quiet +table structure, factual text, compact tags, or status. + +## Component decisions + +| Existing element | Decision | Reason | +| --- | --- | --- | +| Contributions by surface segmented bar | Keep | It encodes a true 6:2:2 proportion and filters the registry. | +| Enabled coverage bar | Replace with `enabled / installed` text and disabled count | Six of six is a categorical availability fact; the bar added no comparison value. | +| Provider cards and contribution micro-bars | Replace with selectable data-table rows and contribution tags | Providers are records; `+1 panel` and `+1 tool` are the complete discrete data. | +| Surface share bars | Remove; use group count, mount context, and dense rows | The header already shows the global proportion; repeating it per group was redundant. | +| Available compatibility bars | Replace with built-for and host contract fact rows | Contract v1 versus v2 is a version mismatch, not progress toward a goal. | +| Available card pair | Replace with one registry table | Install candidates are comparable records, not dashboard tiles. | + +## Kimi validation rounds + +### Round 1 — 48 / 100 + +Kimi found five wrong-component choices and eleven craft issues. The bars were correctly gone, but +scalar metadata still wore badge chrome: contribution counts, surface providers, contract versions, +the first-party count, and the held state. It also flagged the desktop detail and mobile summary as +too roomy, and requested an explicit selected-provider mobile state. + +Fixes: converted those badges to plain aligned metadata; made contract versions categorical fact +rows; reduced the manifest to a dense definition-list side panel; removed the duplicate held badge; +compressed the mobile summary; and added the selected-provider bottom-sheet shot. Kimi also asked to +rewrite capability descriptions, but that was not applied because the owner locked copy meaning. + +### Round 2 — 82 / 100 + +Kimi reported **zero wrong-component findings**. It confirmed that enabled coverage, provider +contribution counts, surface shares, and compatibility were now represented as text/records, and +that the segmented 6:2:2 surface bar was the sole justified visualization. Four craft issues +remained: the rounded primary switcher, mobile Available density, prose treatment for compatibility +and hold information, and mobile summary height. + +Fixes: retained the primary switcher because it is the repository's existing Fresh UI tabs/segmented +grammar rather than a hand-rolled ornament; restored the real Fresh UI button interaction states; +added canonical `ns-card` and `ns-data-table` composition classes; tightened mobile Available rows; +and reduced the mobile summary from three bands to a 2×2 composition. The held state remains a real +Fresh UI `InlineNotice` because it is actionable warning state, not generic metadata. + +### Round 3 — 98 / 100 + +Kimi reported **zero wrong-component findings and zero slop findings**. It confirmed that the +segmented surface split is the sole visualization; that Providers, Surfaces, and Available are now +record structures; and that desktop side-panel plus mobile bottom-sheet are the correct detail +carriers. It also accepted the canonical Fresh UI segmented control, Card, DataTable, InlineNotice, +and hard-offset Button treatments as system primitives rather than local ornament. + +Kimi held back two points for non-blocking craft observations: the 6-item Panels surface group is +naturally taller than the two 2-item groups on the right, and `CONTRIBUTES` appears once in the +manifest definition list and again above its detailed grouping. Neither is a component error or +slop, and the run stopped because it passed the owner-defined threshold with no wrong-component or +slop findings. + +## Before / after + +Before, four unrelated facts were forced into horizontal bars, producing solid ink strips that read +as redactions. Providers and install candidates were also presented as cards even though their data +was row-shaped and directly comparable. + +After, the screen reads as an extension registry and mount map. The header is one compact Fresh UI +Card with the 6:2:2 segmented signature and textual inventory facts. Providers form a selectable +DataTable; contribution tags have become plain metadata and every requested column is visible. +Surfaces are grouped DataTable rows with host mount context and no repeated share visualization. +Available is one registry table whose contract mismatch is expressed as built-for/host facts plus a +single InlineNotice. Fresh UI Buttons own their real pressed interaction states. Mobile uses a 2×2 +summary, full-width record rows, and the existing manifest bottom sheet. + +## Validation + +- Playwright matrix: Providers / Surfaces / Available × desktop 1440 / mobile 390 × light / dark — + **12 / 12** with no document or screen overflow, no rendered template holes, and no deprecated bar + components. +- Component composition in the rendered matrix: one signature `ns-extchan` in every state; + `ns-card`, `ns-data-table`, `ns-btn`, and `ns-inline-notice` present where their data/interaction + requires them. +- Provider selection: verified in desktop side-panel and mobile bottom-sheet screenshots. +- CSS scope: the S16 block contains no raw hex or RGBA values; only `--ns-*` tokens are used. +- Console: no application errors; the static Python server reports only the unrelated missing + `/favicon.ico` request. + +Final screenshots are in `V12-refix-shots/round3/`. Rounds 1 and 2 are retained beside them as the +visual evidence trail for the 48 → 82 → 98 evaluator trajectory. + +## Honest gaps + +- The Surfaces composition deliberately preserves one tall Panels group beside two shorter groups; + this mirrors the real 6:2:2 data and leaves some passive whitespace below the right column. +- The manifest repeats `CONTRIBUTES` at summary and detail levels. The first is a definition-list + value; the second labels the grouped records. Kimi treated this as minor redundancy, not a wrong + component. +- Capability descriptions and `+N` contribution labels were not rewritten because routes, data, + and copy meaning were explicitly locked. diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-dark-available.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-dark-available.png new file mode 100644 index 000000000..93834b254 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-dark-available.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-dark-providers.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-dark-providers.png new file mode 100644 index 000000000..6811ec78b Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-dark-providers.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-available.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-available.png new file mode 100644 index 000000000..9445df2a4 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-available.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-provider-selected.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-provider-selected.png new file mode 100644 index 000000000..5e1f46543 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-provider-selected.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-providers.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-providers.png new file mode 100644 index 000000000..d4a83f65c Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-providers.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-surfaces.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-surfaces.png new file mode 100644 index 000000000..20d0999c3 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/desktop-light-surfaces.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-dark-available.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-dark-available.png new file mode 100644 index 000000000..95f3dc675 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-dark-available.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-light-providers.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-light-providers.png new file mode 100644 index 000000000..18aa26fcd Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-light-providers.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-light-surfaces.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-light-surfaces.png new file mode 100644 index 000000000..02bd5c95d Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/after/mobile-light-surfaces.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-dark-available.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-dark-available.png new file mode 100644 index 000000000..0b6ec821a Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-dark-available.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-dark-providers.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-dark-providers.png new file mode 100644 index 000000000..7d9f71970 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-dark-providers.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-available.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-available.png new file mode 100644 index 000000000..a41c37fc5 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-available.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-provider-selected.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-provider-selected.png new file mode 100644 index 000000000..7e94ce292 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-provider-selected.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-providers.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-providers.png new file mode 100644 index 000000000..591c6df97 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-providers.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-surfaces.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-surfaces.png new file mode 100644 index 000000000..6dd8b8d7a Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/desktop-light-surfaces.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-dark-available.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-dark-available.png new file mode 100644 index 000000000..59fa886bd Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-dark-available.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-light-providers.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-light-providers.png new file mode 100644 index 000000000..12754333a Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-light-providers.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-light-surfaces.png b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-light-surfaces.png new file mode 100644 index 000000000..befcf6e60 Binary files /dev/null and b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix-shots/before/mobile-light-surfaces.png differ diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix.md new file mode 100644 index 000000000..cb27dc2aa --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V12-slopfix.md @@ -0,0 +1,74 @@ +# V12 Extensions — Fresh UI slop fix + +## Design question + +*"What tailored components, layout, composition, data-visualization, and data-structure best showcase EXTENSIONS — installed add-ons that mount contributions into host surfaces — and how do they compose together?"* + +A compact contribution console: a flat summary card with one segmented contribution-by-surface +bar; a dense provider roster paired with a sticky manifest detail; a surface view organized as +aligned panel/command/tool lanes; and an available list with contract-compatibility facts. Providers +remain the primary records, contributions are grouped by host surface, and selection reveals source, +version, trust, contract, permissions, and mount points. The surface bar carries the only chromatic +signature; flat cards, internal hairlines, neutral metadata tags, and one pressed primary Install +action supply the Fresh UI grammar around it. + +## Slop-checklist result + +| # | Violation found before | Fix applied | Result | +| --- | --- | --- | --- | +| 1 | The overview, provider rows, manifest, lanes, mount tiles, and available cards mixed colored borders, colored side rails, and 6–12px rounding. | Rebuilt the visual containers with real Card grammar: `--ns-card`, `--ns-shadow-xs`, zero outer border/radius, and `--ns-border` internal rules. Removed every colored side/top rail. | PASS | +| 2 | Decorative diamonds, warning marks, surface glyphs, permission glyphs, arrows, colored pips, and pill controls appeared throughout all three views. | Removed the S16 decorative glyph nodes. Recast filters, counts, tiers, mounts, providers, versions, and permissions as 4px DM Mono uppercase tags. Kept only the small status dot because it carries enabled state. | PASS | +| 3 | Copper, teal, amber, success teal, and warning amber competed across cards, icons, rails, badges, and meters. | Reserved copper/teal/amber for the single overview contribution-by-surface bar and its legend. Supporting meters, provider micro-bars, lane meters, tags, and selected states are neutral ink-on-surface. Warning remains only where it communicates a held contract; copper remains on the one primary Install action. | PASS | +| 4 | Rounded grids created excess gutters; mobile stacked large boxes; contribution paths used clipping/ellipsis; lanes left uneven visual mass. | Tightened the summary and rows, used `min-width: 0` and wrapping/`overflow-wrap`, removed value ellipsis, stretched Available cards equally, and composed the tall Panels lane beside stacked Commands/AI Tools lanes. Playwright found zero horizontal overflow and zero visible template holes in 12 Extensions variants. | PASS | +| 5 | The Surfaces view used disconnected colored cards and ornamental lane caps rather than a coherent contribution map. | Removed fake connector/rail decoration. The view is now an aligned two-column surface composition with one tall panel lane, two stacked secondary lanes, shared row rules, bottom-pinned summaries, and no implied graph geometry. | PASS | +| 6 | The lede read like landing-page prose: “Every UI contribution in the app … The dashboard is itself a plugin.” The held state used explanatory filler. | Replaced it with “Installed add-ons and the host surfaces they extend.” Reduced quarantine copy to “Held: built for contract v1; host contract v2.” Labels remain terse and developer-side. | PASS | +| 7 | S16 hand-rolled outlined cards, saturated pills, compatibility boxes, and badges diverged from Fresh UI primitives. The block also contained raw hex and non-sanctioned color mixing. | Matched `card.css`, `badge.css`, `data-table.css`, `detail-layout.css`, `button.css`, and `inline-notice.css`: flat Card surfaces, hairline row divisions, 4px metadata tags, grid structure without chrome, and token-only colors. The Pass V12 block contains no raw hex or raw RGBA. | PASS | +| 8 | The contribution concept was strong, but multiple colored micro-bars, rails, icons, and hard shadows competed to be the signature. | Made the segmented contribution-by-surface bar the single feature signature. Kept exactly one hard-offset `3px 3px 0` press shadow on the visible Install action; computed-style verification found exactly one. | PASS | +| 9 | Accent rails, glyph boxes, tinted group headers, and dashed separators were ornamental rather than structural. | Removed them. Remaining structure encodes data: surface proportions, enabled ratio, contract compatibility, selected provider, contribution grouping, mount points, and permissions. Internal rules separate real row/group boundaries. | PASS | +| 10 | Body-font pills, mixed-case tags, oversized glyph gutters, and four airy header blocks weakened scan hierarchy. | Metadata now uses DM Mono, uppercase, `.08em` tracking, fit-content width, and 4px radius. Headings stay DM Sans/Mono at restrained sizes; the summary is a contiguous strip and contribution rows are dense with consistent breathing room. Computed styles confirm DM Mono, uppercase, and 4px tag radius. | PASS | +| 11 | Reference ideas had accumulated decoration instead of retaining the references’ density and restraint. | Summary strip follows `11-devconsole-a.png`’s contiguous RECORDS/SIZE/PARTITIONS metric rail; provider rows follow its dense records-table rhythm; manifest contribution rows follow `19-pm-dashboard.png`’s compact My Projects metadata rows; Surfaces uses `21-flow-builder.png`’s primary-canvas/secondary-palette composition without inventing connectors; Available uses the compact contract/action density of `11-devconsole-a.png`’s side panel. | PASS | +| 12 | The page risked repeating the rounded-card dashboard grammar used elsewhere; Providers and Surfaces also repeated each other’s card treatment. | Extensions now has a distinct provider → manifest → surface composition and a single segmented contribution signature. Providers is roster/detail, Surfaces is lane composition, and Available is contract/install comparison. All 16 routes were clicked successfully after the change; each produced its expected screen label. | PASS | + +## Before / after + +Before, the screen read as a branded template: rounded colored outlines on nearly every object, +decorative diamonds and warning glyphs, copper/teal/amber repeated across the entire viewport, +marketing copy, full-height accent rails, and several press shadows. The provider roster was harder +to scan because icons and tags consumed the first read; the Surfaces view looked like three unrelated +card stacks; Available used colored rails and boxed compatibility widgets. + +After, the hierarchy survives the squint test: title and view control; one flat summary strip; the +colored surface-distribution signature; then the active working view. Provider records and manifest +metadata read as one dense console, Surfaces aligns one primary lane against two secondary lanes, +and Available compares two equal-height contract records. Dark mode preserves the same hierarchy +without gradients or special-case tint decoration. + +Screenshots are in `V12-slopfix-shots/`: + +- `before/` and `after/` each contain desktop light Providers, provider selection, Surfaces, + Available, desktop dark Providers/Available, mobile light Providers/Surfaces, and mobile dark + Available. + +## Verification + +- Browser: headless Chromium at the required Playwright executable. +- Extensions matrix: Providers / Surfaces / Available × 1440 / 390 × light / dark = 12 variants. +- Provider interaction: six providers found; selecting the second provider produced exactly one + selected row and updated the manifest. +- Layout/content: zero horizontal overflow, zero visible `{{ }}` holes, and zero decorative S16 + glyphs in every variant. +- Console: zero application console errors and zero page errors (the static-server favicon request + was fulfilled by the browser harness so it could not pollute the application-error gate). +- Component grammar: all visible summary/provider/manifest/lane/available cards computed to + `border-radius: 0` and zero outer border; metadata tags computed to DM Mono, uppercase, 4px radius. +- Signature: exactly one visible `3px 3px 0` hard press shadow, on `Install`. +- Regression: all 16 navigation buttons rendered the expected `data-screen-label`; all had zero + horizontal overflow and zero visible template holes. + +## Honest gaps + +- Per owner direction, this slice did not produce a new PLAN-EVAL or GLM evaluator report. The + original dashboard-design run already has PLAN-EVAL PASS; this focused visual refinement was + verified directly with screenshots and browser assertions. +- The other 15 routes were regression-clicked and measured, but were not re-screenshotted because + the requested visual scope is Extensions only. diff --git a/.llm/runs/beta10--orchestrator/render/_visual-reports/V2-shell-home.md b/.llm/runs/beta10--orchestrator/render/_visual-reports/V2-shell-home.md new file mode 100644 index 000000000..d0b917f7c --- /dev/null +++ b/.llm/runs/beta10--orchestrator/render/_visual-reports/V2-shell-home.md @@ -0,0 +1,133 @@ +# V2 — BOLD shell + Home redesign (sets the new quality bar) + +Scope: **shell (sidebar + topbar) + Home only**. Visual + layout only — no route, logic, data, +feature, or copy-meaning change. Warm-cream light + dark, hard-offset press shadow, `--ns-*` tokens +only (no raw hex), `ns-*` class markup, DM Sans / DM Mono preserved. Zero `{{ }}` in the rendered +DOM, zero console errors, no horizontal body scroll — verified desktop (1440×900) **and** mobile +(390×844), both themes, plus a rail-collapsed and drawer-open pass. + +Reference bar: `references/01-synergy-hr-desktop`, `02-synergy-mobile-nav`, `03-analytics-cards`, +`04-finance-cards`, `05-timeoff-workhour-cards`, `06-mobile-sheets`, `08-ref` (Pulsar, the closest +dev-dashboard analogue), `09-ref`. Adopted their **structure / density / component-variety / +hierarchy / chrome / responsiveness**; kept NS One's **identity** (copper primary, teal/amber/red +state — not the refs' purple/green/soft-rounded). + +## Files touched +- `render/prototype.dc.html` — shell markup (sidebar + topbar), Home markup recomposition, S1 data + builders in the `data-dc-script` logic, two post-mount geometry drawers. +- `render/assets/ns-ext.css` — all net-new component CSS (loads last; overrides DS defaults where + needed). `proto.css` and the DS `_ns_styles.css` / `support.js` were **not** edited. + +## The one collision that mattered (recorded so it doesn't recur) +The DS ships a layout primitive named **`.ns-sidebar`** (Every-Layout "Sidebar": a horizontal +sidebar+content flex row). Adding `ns-sidebar` to the dashboard `