Cycles by week
Week of Sep 7

3 started, 1 closed, 20 carried live.

Busiest record: c85 Chat Transcript (4 entries) · 47 carried cycles have gone quiet · layer v0.9.12 → v0.9.12

Started
3
Still open
67
Closed
1
Record entries
5
Commits
24
Captures
0
Releases · deploys
1

Commits

24 commits across 4 repos, on each repo's checked-out branch.

Cycles

Started 3

c85Chat Transcript

transcript/* component namespace (q-nuxt-layer) for rendering an agent chat session — messages, collapsible tool-call bursts, and a ChatGPT-style hover-expanding turn navigator.

started Sep 114 in the log

Still open 20

c84Cycles Status Page

Redesign /cycles into a living Design status surface - working now, decisions, seeds, blocked work, abandoned ideas, and the existing atlas

started Sep 32 wks · moved this week
c81Phase 1 Pages

First-pass mocks for all 17 Phase-1 dashboard pages (Linear PRO-19…35) on one unified fixture world — the simplest literal execution of the listing → expand → detail → actor-web pattern

started Sep 12 wks · moved this week
c11Conversation ProfilesMarket Analyst

Declare the nature of each conversation at triage (source type × call type), tag every observation with the speaker's perspective (first-hand / relayed / internal), enforce evidence ceilings and a code-computed validation gate, extract session records (decisions / todos / ideas) from working sessions, and formalize the conversations → insights → brief hand-off into the design machine.

started Sep 32 wks · quiet 1
c80brotli-stream-termination

qproxy MITM truncates streamed brotli response bodies — client apps show Decompression error: BrotliDecompressionError

started Aug 273 wks · quiet 1
c78fleet-overview-reports

Design the four product reports (Compliance, SLA Insights, Inventory, Board) and the fleet overview landing page as a summary of them.

started Aug 204 wks · quiet 1
c72Integrations Create & Manage

Create/configure modal for 11 connectors with per-integration custom UI and step-by-step operator guidance

started Aug 155 wks · quiet 1
c70Thesis Kindle

Convert "Looking In" thesis to Kindle-compatible formats (EPUB + print-replica PDF) while preserving images and foundational status

started Aug 155 wks · quiet 1
c67Teams

Refine the qdash /teams design — composition from c61 concepts, mapping workspace as the pre-SCIM write path, slim spend overview, credentials relocated

started Aug 145 wks · quiet 1
c49Fix the Cloudflare Pages Deploy

Make push to main reliably deploy the design site to Cloudflare Pages *(2026-09-25: reframed as "make the build a manual local step", see PICKUP.md)*

started Jun 1114 wks · quiet 1
c79Finding Lifecycle

Mock the finding-lifecycle state machine and the mechanics/UI of turning findings into SLA data — the design answer to c78's open resolution-workflow gap.

started Aug 253 wks · quiet 2
c68index-overview

Design the qdash landing page — what the user is greeted with on login, resolving the Fleet Overview / Agent Inventory overlap.

started Aug 145 wks · quiet 2
c7avoma-notesMarket Analyst

Explore and integrate Avoma notes data into extraction pipeline and dashboard visualizations.

started Feb 25parked
c4refinementMarket Analyst

Refine how extracted data is displayed in the dashboard and improve extraction quality where gaps exist.

started Feb 24parked
c3oauthMarket Analyst

Add Google OAuth to restrict dashboard access to @qpoint.io team members.

started Feb 20parked
c69Operating System

Methods & tooling retro — evaluate how we work against the design methodology, restore order, modernize the skill/agent tooling, and make the philosophy load-bearing

started Aug 15parked
c62build-partner

Build-partner portal — research, ideation, and a plan for a page that makes partners insiders

started Aug 8parked
c55agent-market-definition

Align the qcontrol agent-monitoring dashboard to specific personas and find market alignment — hypothesis-first, validated against calls later.

started Jul 24parked

Closed 1

Pages & components

What this week's captures picture — . Each links to its evolution: every moment it was shot, across cycles.

No page or component captures this week.

Log

Key Changes entries dated inside the week, from each cycle's record — newest first within a cycle.

c87 History Graph

Sep 11
  • 2026-09-11: Built the history-graph namespace on top of DonutChart's palette/legend precedent. The mock's black/blue/grey don't map to existing semantic tokens (no true blue token; a literal neutral gray always fails the dataviz validator's chroma floor by construction — that check exists specifically to keep "reads as gray" colors out of categorical data, so the third slot is a validated muted sage rather than literal gray). Landed the stacked-unit algorithm: a shared "nice" unit value keeps the tallest column under the block cap across any range, with auto-fallback to continuous bars past 40 columns (verified against the 60-day fixture) — reusing the same px-per-value scale in both modes so bar mode reads as the continuous version of the same chart, not a different one. Found and fixed two real bugs via Playwright verification against the running dev server: (1) a date-only ISO string ("2026-09-07") parses as UTC midnight, which showed the previous weekday in any timezone behind UTC — fixed by treating bare date strings as local calendar days; (2) resolving series color reactively from colorScheme.value (needed since these are literal hexes, not qp() CSS vars) hit the exact SSR/hydration-mismatch case ThemeToggle.vue already documents — fixed with the same mounted-gated pattern, verified by loading the page fresh with dark mode already stored (not just toggling live). Mark then flagged that columns were stretching to fill wide containers (flex-1 on both the columns row and each column) instead of sitting at their natural pictogram size — discussed two options and chose "fixed width that can shrink but never grow" over "always fixed" so a 7-day chart stays compact while a 60-day one still compresses to fit. Landed as an explicit per-format columnWidth (28/24/42px for weekday/day/date) on flex: 0 1 <width>px. Hit a second, subtler bug getting there: the columns wrapper's own flex-basis: auto didn't reliably resolve to the sum of its children's explicit flex-basis values — a flex item that's itself a flex container doesn't reliably auto-size that way, worse with min-w-0 in play — so columns silently shrank to ~19px with truncated labels even with acres of free space. Fixed by computing the wrapper's own width explicitly (n × columnWidth + gaps) instead of trusting auto. Mark also asked for square (not rounded) blocks and for block size / vertical gap between stacked blocks to be real props rather than baked-in constants — added blockSize/blockGap (defaults 6px/2px, down from the previous fixed 8px/4px) threaded from DataHistoryGraph through Column to Block, with the unit-scaling pitch (blockSize + blockGap) now derived from them instead of a hardcoded 12, and dropped rounded-sm from both blocks and bar-mode segments. Finally, Mark flagged (with a corrected reference image) that series should render as independent side-by-side lanes per day, not summed into one stacked column — reversing this session's earlier read of the mock. Reworked the scaling to key off the tallest single-series value (not the per-day sum), since lanes no longer share a column's height budget, and Column now renders one fixed-width lane per series (flex-col-reverse, its own baseline-aligned stack) inside a centered row, instead of one interleaved stack. Column width now also accounts for the lanes' combined width (seriesCount × blockSize + gaps), not just the label's needs, so charts with more series than a short label can fit don't crowd their lanes. Last, promoted the previously-hardcoded 8px gap between day columns to a dayGap prop (default unchanged at 8px) alongside blockSize/blockGap, replacing the static gap-2 Tailwind class with an inline style bound to the prop. Mark then reported blockSize causing "massive top padding" when increased on the demo's slider — root cause was the shared dev/meta/PropsMachine.vue control's range/text v-model lacking a .number modifier, so an edited numeric adminProp arrives as a string; Column's pitch = props.blockSize + props.blockGap then did string concatenation ("16" + 2 -> "162") instead of addition, and areaHeight = maxUnits × "162" re-coerced through multiplication to 972px for a chart that should have been 108px. columnWidth/columnsAreaWidth were already safe (their + only ever combines two products, which forces numeric coercion first) — fixed the one unsafe line with explicit Number(...) rather than touching the shared dev tool, which other consumers apparently avoid tripping since they use -/*// on their numeric adminProps, never a bare +. Rounded out the sizing props with labelSize (default 11px, matching the previous hardcoded text-11) — the label-driven minimum column width (LABEL_COLUMN_WIDTH) now scales proportionally with it so a bigger label doesn't truncate against a width calibrated for the old fixed 11px. Mark then caught a large empty gap under legendBelow — the columns wrapper sized itself with flex: 0 1 Xpx, and flex-basis follows the flex container's main axis; toggling legendBelow switches that axis from row to column, so the same Xpx (a width) was being applied as a height instead once the layout went vertical. Fixed by using width: Xpx directly, which is axis-independent and (via flex-basis:auto falling back to the width property) behaves identically to the old row-mode shrink behavior while also being correct in column mode. Last, linked the legend's label size to labelSize + 1 rather than a hardcoded text-15.

c85 Chat Transcript

Sep 11
  • 2026-09-11: Built the transcript namespace: TranscriptPanel (card shell, turn count, navigator + turn stack, scroll-to-turn), TranscriptNavigator (tick rail with a hover-distance-based flyout, truncation via line-clamp), TranscriptTurn/TranscriptMessage (one bubble per speaker message, right-aligned with UxAvatar for the user, left-aligned with an inline AgentPawn for the agent), TranscriptToolCall (collapsed row → expanded input/content/output monospace block, local expanded ref). Resolved the initial prompt's flagged items/items naming collision as parts (message content) vs messages (turn's speaker groups). Renamed the stale, uncommitted "c85. Phase-2 Pages" entry in cycles/CYCLES.md to this cycle. Verified all four demo states (empty/minimal/typical/overflow) and the tool-call expand + navigator hover interactions via Playwright against the running dev server.
Sep 11
  • 2026-09-11 (follow-up): Tightened fidelity to the reference sketch — entity icon inline at the bubble's bottom corner (was stacked below), monospace chat/tool-call text, no purple bubble background. Reworked the navigator: no dead space between tick rows (clicks now target whichever turn currently has the most cursor-proximity influence, not the exact row under the pointer), hover fan replaced a per-tick rotate effect with width-only growth (rotation read as noise, not signal), and centered the rail on the panel's own height via flex rather than a translateY transform (a transform on an ancestor traps a position:fixed descendant in that ancestor's box — broke the flyout). TranscriptPanel became self-contained: flex flex-col h-full + minHeight prop, internal overflow-y-auto turn list so the panel (not the page) owns its own scroll — scrollToTurn now scrolls that container directly instead of scrollIntoView(), which was also dragging the outer page (and the panel's own header) along with it. Fixed one real layer-gotcha violation found in cleanup: max-w-[560px] (arbitrary Tailwind value, unreliably scanned in layer components) → inline style="max-width: 560px".
Sep 11
  • 2026-09-11 (design revisions + documentation): Iterated the message bubble's tail through three techniques before landing: a thin SVG line (matched the hand sketch's stroke but couldn't read as attached), a CSS-border triangle glued to the bubble corner (a proper wedge, but reached for the avatar rather than sitting flush), then Mark's skewed-square border-trick (ported faithfully — colors read the same --qp-surface/ --qp-stroke custom properties Tailwind's bg-surface/border-stroke resolve to, since this repo drives theming through those vars rather than a dark: class). Fixed a real bug surfaced along the way: flex-row-reverse had user/agent swapped relative to what the bubble's corner-cuts assumed, so identity marks sat on the wrong side of their bubble. Polish pass: thicker/more padded bubbles, shrink-0 + a floor-clearing translateY on the identity marks so they don't compress or overlap the tail. Swapped TranscriptPanel's h-full for max-h-full so a short transcript shrink-wraps to content instead of always stretching to fill the ancestor's height — flex-1/min-h-0 still caps and scrolls once content exceeds it, no conflict between the two behaviors. Hid the navigator (and its reserved gutter) when a transcript has only one turn, since there's nothing to navigate between. Documented all five components on /components via the document-components skill: new transcript registry group, one demo file per component (TranscriptPanel's reuses the four /pages fixtures behind a state toggle), and a Visual-view thumbnail.
Sep 11
  • 2026-09-11 (sizing bug): The max-h-full shrink-to-fit change above had two real bugs, both found on the doc page (a taller viewport made them obvious). Internal scroll: the scroller's h-full silently grew to content height instead of clamping — a max-height-derived parent size isn't reliably "definite" enough for a nested percentage-height child — so overflow never triggered and content just got clipped by the panel's own overflow-hidden. First fix attempt (position: absolute on the scroller) traded that bug for a worse one: absolutely-positioned content doesn't count toward an ancestor's auto/content-based height, so short transcripts collapsed to just the header. Tried height: clamp(minHeight, max-content, 100%) next — invalid CSS (max-content isn't a valid argument inside clamp()/min()/max(), only lengths/percentages are), silently dropped, height fell back to unbounded auto. Landed on max-h-full (unchanged) paired with a normal in-flow flex-1 min-h-0 scroller instead of the old relative + two absolutely-positioned children layout — verified all four fixture states hit the right number (960px capped+scrolling for Typical/Overflow, 480px floor for Minimal/Empty) at a 1600px-tall viewport. Also added a max-width: 640px wrap on the doc-page demo instance only — TranscriptPanel itself stays unconstrained/fill-width by default.

Captures

0 screengrabs taken this week.

No captures this week.

Releases & deploys

Layer releases 1

v0.9.12Sep 11v0.9.12: DataHistoryGraph + Transcript components (c85, c87)

Design-site deploys 0

No deploys recorded this week.

Note: Deploys come from this checkout's deploy-branch reflog, which starts 2026-10-16.

Qpoint Brand Style Guide