[{"data":1,"prerenderedAt":1556},["ShallowReactive",2],{"$fqMpUWkvkrN1iP_ygsZWsSyyr45TaJh-cOoa8EznQqkk":3},{"from":4,"to":5,"cycles":6,"entries":492,"repos":1442,"releases":1546,"deploys":1549,"captures":1550,"clusters":1551,"subjects":1552,"notes":1553,"week":4,"prev":80,"next":1555,"current":23},"2026-09-07","2026-09-13",{"started":7,"open":40,"closed":490},[8,25,33],{"project":9,"projectLabel":10,"id":11,"num":12,"dir":13,"title":14,"focus":15,"status":16,"thumbnail":17,"started":18,"startedSource":19,"closed":20,"closedSource":19,"openWeeks":21,"quietWeeks":22,"stale":23,"active":24},"design","Design","c87",87,"c87.history-graph","History Graph","`DataHistoryGraph` component family (q-nuxt-layer) — a pictogram-style","archived","\u002Fcycles\u002Fdesign\u002Fc87-history-graph.png","2026-09-11","record","2026-09-18",1,0,false,true,{"project":9,"projectLabel":10,"id":26,"num":27,"dir":28,"title":29,"focus":30,"status":31,"thumbnail":30,"started":18,"startedSource":32,"closed":18,"closedSource":32,"openWeeks":21,"quietWeeks":22,"stale":23,"active":24},"c86",86,"c86.machine-status","machine status",null,"recordless","git",{"project":9,"projectLabel":10,"id":34,"num":35,"dir":36,"title":37,"focus":38,"status":16,"thumbnail":39,"started":18,"startedSource":19,"closed":20,"closedSource":19,"openWeeks":21,"quietWeeks":22,"stale":23,"active":24},"c85",85,"c85.chat-transcript","Chat Transcript","`transcript\u002F*` component namespace (q-nuxt-layer) for rendering an agent chat session — messages, collapsible tool-call bursts, and a ChatGPT-style hover-expanding turn navigator.","\u002Fcycles\u002Fdesign\u002Fc85-chat-transcript.png",[41,51,59,67,72,81,89,98,106,112,120,129,137,144,150,158,164,171,178,187,195,202,207,213,219,226,230,238,246,254,261,271,277,284,291,297,303,313,320,325,332,340,347,356,363,370,376,381,386,390,394,402,411,419,426,429,432,437,442,446,450,456,462,469,474,478,485],{"project":9,"projectLabel":10,"id":42,"num":43,"dir":44,"title":45,"focus":46,"status":47,"thumbnail":48,"started":49,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":50,"quietWeeks":22,"stale":23,"active":24},"c84",84,"c84.cycles-status-page","Cycles Status Page","Redesign `\u002Fcycles` into a living Design status surface - working now, decisions, seeds, blocked work, abandoned ideas, and the existing atlas","active","\u002Fcycles\u002Fdesign\u002Fc84-cycles-status-m1-workboard.png","2026-09-03",2,{"project":9,"projectLabel":10,"id":52,"num":53,"dir":54,"title":55,"focus":56,"status":47,"thumbnail":57,"started":58,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":50,"quietWeeks":22,"stale":23,"active":24},"c81",81,"c81.phase1-pages","Phase 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","\u002Fcycles\u002Fdesign\u002Fc81-accounts-clear.png","2026-09-01",{"project":60,"projectLabel":61,"id":62,"num":63,"dir":64,"title":65,"focus":66,"status":47,"thumbnail":30,"started":49,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":50,"quietWeeks":21,"stale":23,"active":23},"market-analyst","Market Analyst","c11",11,"c11.conversation-profiles","Conversation Profiles","Declare the nature of each conversation at triage (source type × call type), tag every observation with the speaker's perspective (first-hand \u002F relayed \u002F internal), enforce evidence ceilings and a code-computed validation gate, extract session records (decisions \u002F todos \u002F ideas) from working sessions, and formalize the conversations → insights → brief hand-off into the design machine.",{"project":9,"projectLabel":10,"id":68,"num":69,"dir":70,"title":71,"focus":30,"status":47,"thumbnail":30,"started":58,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":50,"quietWeeks":21,"stale":23,"active":23},"c76",76,"c76.simpler-light-dark-mode-colors","simpler light dark mode colors",{"project":73,"projectLabel":74,"id":75,"num":76,"dir":77,"title":78,"focus":79,"status":47,"thumbnail":30,"started":80,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":50,"quietWeeks":21,"stale":23,"active":23},"bob-wire","Bob-Wire","c21",21,"c21.inventory","Inventory + Users \u002F Devices","Design refinement of qcontrol's Inventory and Users\u002FDevices pages, driven by Mark Peterson advisor call","2026-08-31",{"project":9,"projectLabel":10,"id":82,"num":83,"dir":84,"title":85,"focus":86,"status":47,"thumbnail":30,"started":87,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":88,"quietWeeks":21,"stale":23,"active":23},"c80",80,"c80.brotli-stream-termination","brotli-stream-termination","qproxy MITM truncates streamed brotli response bodies — client apps show `Decompression error: BrotliDecompressionError`","2026-08-27",3,{"project":9,"projectLabel":10,"id":90,"num":91,"dir":92,"title":93,"focus":94,"status":16,"thumbnail":30,"started":95,"startedSource":19,"closed":96,"closedSource":19,"openWeeks":97,"quietWeeks":21,"stale":23,"active":23},"c78",78,"c78.fleet-overview-reports","fleet-overview-reports","Design the four product reports (Compliance, SLA Insights, Inventory, Board) and the fleet overview landing page as a summary of them.","2026-08-20","2026-11-03",4,{"project":9,"projectLabel":10,"id":99,"num":100,"dir":101,"title":102,"focus":103,"status":47,"thumbnail":30,"started":104,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":21,"stale":23,"active":23},"c72",72,"c72.integrations-create-manage","Integrations Create & Manage","Create\u002Fconfigure modal for 11 connectors with per-integration custom UI and step-by-step operator guidance","2026-08-15",5,{"project":9,"projectLabel":10,"id":107,"num":108,"dir":109,"title":110,"focus":111,"status":47,"thumbnail":30,"started":104,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":21,"stale":23,"active":23},"c70",70,"c70.thesis-kindle","Thesis Kindle","Convert \"Looking In\" thesis to Kindle-compatible formats (EPUB + print-replica PDF) while preserving images and foundational status",{"project":9,"projectLabel":10,"id":113,"num":114,"dir":115,"title":116,"focus":117,"status":47,"thumbnail":118,"started":119,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":21,"stale":23,"active":23},"c67",67,"c67.teams","Teams","Refine the qdash `\u002Fteams` design — composition from c61 concepts, mapping workspace as the pre-SCIM write path, slim spend overview, credentials relocated","\u002Fcycles\u002Fdesign\u002Fc67-teams-ideas-v2.png","2026-08-14",{"project":9,"projectLabel":10,"id":121,"num":122,"dir":123,"title":124,"focus":125,"status":16,"thumbnail":30,"started":126,"startedSource":19,"closed":127,"closedSource":19,"openWeeks":128,"quietWeeks":21,"stale":23,"active":23},"c49",49,"c49.cloudflare-deploy-fix","Fix 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)*","2026-06-11","2026-09-30",14,{"project":9,"projectLabel":10,"id":130,"num":131,"dir":132,"title":133,"focus":134,"status":47,"thumbnail":135,"started":136,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":88,"quietWeeks":50,"stale":23,"active":23},"c79",79,"c79.finding-lifecycle","Finding Lifecycle","Mock the finding-lifecycle state machine and the mechanics\u002FUI of turning findings into SLA data — the design answer to c78's open resolution-workflow gap.","\u002Fcycles\u002Fdesign\u002Fc79-qdash-port-accept-risk.png","2026-08-25",{"project":9,"projectLabel":10,"id":138,"num":139,"dir":140,"title":141,"focus":142,"status":47,"thumbnail":143,"started":119,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":50,"stale":23,"active":23},"c68",68,"c68.index-overview","index-overview","Design the qdash landing page — what the user is greeted with on login, resolving the Fleet Overview \u002F Agent Inventory overlap.","\u002Fcycles\u002Fdesign\u002Fc68-index-glance-ideas.png",{"project":9,"projectLabel":10,"id":145,"num":146,"dir":147,"title":148,"focus":30,"status":149,"thumbnail":30,"started":58,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":50,"quietWeeks":21,"stale":23,"active":23},"c82",82,"c82.cloud-execution","cloud execution","parked",{"project":60,"projectLabel":61,"id":151,"num":152,"dir":153,"title":154,"focus":155,"status":149,"thumbnail":30,"started":156,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":157,"quietWeeks":88,"stale":23,"active":23},"c7",7,"c7.avoma-notes","avoma-notes","Explore and integrate Avoma notes data into extraction pipeline and dashboard visualizations.","2026-02-25",29,{"project":60,"projectLabel":61,"id":159,"num":97,"dir":160,"title":161,"focus":162,"status":149,"thumbnail":30,"started":163,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":157,"quietWeeks":88,"stale":23,"active":23},"c4","c4.refinement","refinement","Refine how extracted data is displayed in the dashboard and improve extraction quality where gaps exist.","2026-02-24",{"project":60,"projectLabel":61,"id":165,"num":88,"dir":166,"title":167,"focus":168,"status":149,"thumbnail":30,"started":169,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":170,"quietWeeks":88,"stale":23,"active":23},"c3","c3.oauth","oauth","Add Google OAuth to restrict dashboard access to @qpoint.io team members.","2026-02-20",30,{"project":9,"projectLabel":10,"id":172,"num":173,"dir":174,"title":175,"focus":176,"status":149,"thumbnail":177,"started":104,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":97,"stale":23,"active":23},"c69",69,"c69.operating-system","Operating System","Methods & tooling retro — evaluate how we work against the design methodology, restore order, modernize the skill\u002Fagent tooling, and make the philosophy load-bearing","\u002Farchive\u002F2026-q3\u002Fc69-pages-index.png",{"project":9,"projectLabel":10,"id":179,"num":180,"dir":181,"title":182,"focus":183,"status":149,"thumbnail":184,"started":185,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":186,"quietWeeks":97,"stale":23,"active":23},"c62",62,"c62.build-partner","build-partner","Build-partner portal — research, ideation, and a plan for a page that makes partners insiders","\u002Fcycles\u002Fdesign\u002Fc62-arcade-organism-ideas.png","2026-08-08",6,{"project":9,"projectLabel":10,"id":188,"num":189,"dir":190,"title":191,"focus":192,"status":149,"thumbnail":30,"started":193,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":194,"quietWeeks":105,"stale":23,"active":23},"c55",55,"c55.agent-market-definition","agent-market-definition","Align the qcontrol agent-monitoring dashboard to specific personas and find market alignment — hypothesis-first, validated against calls later.","2026-07-24",8,{"project":9,"projectLabel":10,"id":196,"num":197,"dir":198,"title":199,"focus":200,"status":47,"thumbnail":201,"started":95,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":97,"quietWeeks":88,"stale":24,"active":23},"c77",77,"c77.session-view","Session View","Session viewer \u002F replay mode for qcontrol AI agent sessions — mocks-first on the design site","\u002Fcycles\u002Fdesign\u002Fc77-session-anatomy-v1.png",{"project":60,"projectLabel":61,"id":203,"num":194,"dir":204,"title":205,"focus":206,"status":47,"thumbnail":30,"started":95,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":97,"quietWeeks":88,"stale":24,"active":23},"c8","c8.agent-pivot","Agent Pivot","Reorient pipeline and app around AI-agent-security pivot: archive phase 1, use-case-centric extraction, multi-source feedback, architecture debt paydown.",{"project":73,"projectLabel":74,"id":208,"num":209,"dir":210,"title":211,"focus":30,"status":47,"thumbnail":212,"started":104,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":97,"stale":24,"active":23},"c20",20,"c20.build-partner-portal","Build Partner Portal","\u002Fcycles\u002Fbob-wire\u002Fc20-index.png",{"project":73,"projectLabel":74,"id":214,"num":215,"dir":216,"title":217,"focus":30,"status":47,"thumbnail":218,"started":104,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":97,"stale":24,"active":23},"c17",17,"c17.owasp-policy-pack","OWASP LLM Top 10 — Policy Pack","\u002Fcycles\u002Fbob-wire\u002Fc17-control-definition.png",{"project":220,"projectLabel":221,"id":222,"num":105,"dir":223,"title":224,"focus":30,"status":47,"thumbnail":225,"started":104,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":97,"stale":24,"active":23},"qpixel","Qpixel","c5","c5.selection-clipboard","Selection Clipboard","\u002Fcycles\u002Fqpixel\u002Fc5-editor.png",{"project":220,"projectLabel":221,"id":159,"num":97,"dir":227,"title":228,"focus":30,"status":47,"thumbnail":229,"started":104,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":97,"stale":24,"active":23},"c4.svg-export","SVG Export","\u002Fcycles\u002Fqpixel\u002Fc4-checkerboard.png",{"project":9,"projectLabel":10,"id":231,"num":232,"dir":233,"title":234,"focus":235,"status":16,"thumbnail":236,"started":119,"startedSource":19,"closed":237,"closedSource":19,"openWeeks":105,"quietWeeks":97,"stale":24,"active":23},"c66",66,"c66.cost-center","cost-center","Add unit-of-measurement toggle to qdash `\u002Fcost` page — switch display between currency ($) and tokens","\u002Farchive\u002F2026-q3\u002Fc66-cost-center-unit-toggle.png","2026-10-01",{"project":9,"projectLabel":10,"id":239,"num":240,"dir":241,"title":242,"focus":243,"status":47,"thumbnail":244,"started":245,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":97,"stale":24,"active":23},"c65",65,"c65.control-center-v2","control-center-v2","Shift the control center from infinitely-configurable controls to a compliance-driven system of pre-defined Policies — research the framework↔policy connection, then mock the policy catalog and per-policy config pages","\u002Fcycles\u002Fdesign\u002Fc65-compliance-frameworks.png","2026-08-12",{"project":9,"projectLabel":10,"id":247,"num":248,"dir":249,"title":250,"focus":251,"status":47,"thumbnail":252,"started":253,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":105,"quietWeeks":97,"stale":24,"active":23},"c64",64,"c64.control-center-consolidation","control-center-consolidation","Consolidate the overlapping Control Center \u002F Policy & Enforcement \u002F Compliance work — current-state evaluation, ranked consolidation plan, initial-ideas mock","\u002Fcycles\u002Fdesign\u002Fc64-control-center-ideas.png","2026-08-10",{"project":73,"projectLabel":74,"id":255,"num":256,"dir":257,"title":258,"focus":259,"status":47,"thumbnail":30,"started":260,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":152,"quietWeeks":97,"stale":24,"active":23},"c19",19,"c19.ai-asset-inventory","AI Asset Inventory","Precedent research for an AI asset inventory page — how existing products present inventories of agents, MCP servers, files, models, and related AI assets","2026-07-31",{"project":262,"projectLabel":263,"id":264,"num":265,"dir":266,"title":267,"focus":268,"status":47,"thumbnail":269,"started":270,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":152,"quietWeeks":97,"stale":24,"active":23},"qflow","Qflow","c12",12,"c12.qcontrol-live-view","qcontrol-live-view","Live qflow visualization of qcontrol agent events — agents pulsing to event-type nodes, fed by qdash SSE, with a growing timeline scrubber","\u002Fcycles\u002Fqflow\u002Fc12-agents-packed.png","2026-07-29",{"project":73,"projectLabel":74,"id":272,"num":273,"dir":274,"title":275,"focus":276,"status":47,"thumbnail":30,"started":193,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":194,"quietWeeks":97,"stale":24,"active":23},"c18",18,"c18.post-mortem-map","Post-Mortem Map","Post-mortem incident map — visualizing an incident that already occurred: the actors involved (user, agent, MCP servers, files, repos) and their state, on an incident page alongside traditional detail sections",{"project":73,"projectLabel":74,"id":278,"num":279,"dir":280,"title":281,"focus":30,"status":47,"thumbnail":282,"started":283,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":128,"quietWeeks":97,"stale":24,"active":23},"c15",15,"c15.agent-dashboard","Agent Dashboard","\u002Fcycles\u002Fbob-wire\u002Fc15-index.png","2026-06-09",{"project":73,"projectLabel":74,"id":285,"num":286,"dir":287,"title":288,"focus":30,"status":47,"thumbnail":289,"started":290,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":279,"quietWeeks":97,"stale":24,"active":23},"c16",16,"c16.agent-control-plane","Agent Control Plane","\u002Fcycles\u002Fbob-wire\u002Fc16-control-plane-integrations.png","2026-06-04",{"project":73,"projectLabel":74,"id":292,"num":128,"dir":293,"title":294,"focus":30,"status":47,"thumbnail":295,"started":296,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":273,"quietWeeks":97,"stale":24,"active":23},"c14","c14.qcontrol-brochure-site","QControl Brochure Site","\u002Fcycles\u002Fbob-wire\u002Fc14-index.png","2026-05-11",{"project":73,"projectLabel":74,"id":298,"num":299,"dir":300,"title":301,"focus":30,"status":47,"thumbnail":302,"started":296,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":273,"quietWeeks":97,"stale":24,"active":23},"c13",13,"c13.ai-agent-policies","AI Agent Policies","\u002Fcycles\u002Fbob-wire\u002Fc13-index.png",{"project":304,"projectLabel":305,"id":306,"num":307,"dir":308,"title":309,"focus":310,"status":47,"thumbnail":311,"started":312,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":256,"quietWeeks":97,"stale":24,"active":23},"qmap","Qmap","c27",27,"c27.mcp-server-fleet","mcp-server-fleet","Deterministic synthetic MCP server fleet views for screenshot capture","\u002Fcycles\u002Fqmap\u002Fc27-callers-selected.png","2026-05-04",{"project":304,"projectLabel":305,"id":314,"num":315,"dir":316,"title":317,"focus":318,"status":47,"thumbnail":30,"started":319,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":209,"quietWeeks":97,"stale":24,"active":23},"c26",26,"c26.flatland-view","flatland-view","Add a `flatland` view (topdown camera + pitched 3D models) for VOX\u002FOBJ-backed actors","2026-04-28",{"project":73,"projectLabel":74,"id":264,"num":265,"dir":321,"title":322,"focus":30,"status":47,"thumbnail":323,"started":324,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":76,"quietWeeks":97,"stale":24,"active":23},"c12.inventory-deep-dive","Inventory Deep Dive","\u002Fcycles\u002Fbob-wire\u002Fc12-index.png","2026-04-24",{"project":73,"projectLabel":74,"id":326,"num":327,"dir":328,"title":329,"focus":30,"status":47,"thumbnail":330,"started":331,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":76,"quietWeeks":97,"stale":24,"active":23},"c10",10,"c10.security-overview-benchmark","Security Overview Benchmark","\u002Fcycles\u002Fbob-wire\u002Fc10-index.png","2026-04-22",{"project":304,"projectLabel":305,"id":333,"num":334,"dir":335,"title":336,"focus":337,"status":47,"thumbnail":338,"started":339,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":76,"quietWeeks":97,"stale":24,"active":23},"c25",25,"c25.ai-ecosystem-inventory-map","ai-ecosystem-inventory-map","Build a qmap inventory\u002Findex view of the company-wide AI ecosystem using deterministic synthetic data first","\u002Fcycles\u002Fqmap\u002Fc25-ai-ecosystem-inventory-map.png","2026-04-21",{"project":73,"projectLabel":74,"id":341,"num":342,"dir":343,"title":344,"focus":30,"status":47,"thumbnail":345,"started":346,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":76,"quietWeeks":97,"stale":24,"active":23},"c9",9,"c9.meaning-layer-dashboard","Meaning-Layer Dashboard","\u002Fcycles\u002Fbob-wire\u002Fc9-index.png","2026-04-20",{"project":304,"projectLabel":305,"id":348,"num":349,"dir":350,"title":351,"focus":352,"status":47,"thumbnail":353,"started":354,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":355,"quietWeeks":97,"stale":24,"active":23},"c24",24,"c24.synthetic-live-session-replay","synthetic-live-session-replay","Build a deterministic synthetic replay path for live-feeling qmap sessions","\u002Fcycles\u002Fqmap\u002Fc24-complete.png","2026-04-17",22,{"project":304,"projectLabel":305,"id":357,"num":358,"dir":359,"title":360,"focus":361,"status":47,"thumbnail":362,"started":354,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":355,"quietWeeks":97,"stale":24,"active":23},"c23",23,"c23.custom-obj-models","custom-obj-models","Validate import, normalization, and rendering of custom `.obj` actor models in qmap","\u002Fcycles\u002Fqmap\u002Fc23-cowboy.png",{"project":304,"projectLabel":305,"id":364,"num":355,"dir":365,"title":366,"focus":367,"status":47,"thumbnail":368,"started":369,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":355,"quietWeeks":97,"stale":24,"active":23},"c22","c22.runtime-session-map","runtime-session-map","Visualize a single qcontrol runtime session as a qmap entity-type topology","\u002Fcycles\u002Fqmap\u002Fc22-fileheavy.png","2026-04-15",{"project":304,"projectLabel":305,"id":75,"num":76,"dir":371,"title":372,"focus":373,"status":47,"thumbnail":374,"started":375,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":349,"quietWeeks":97,"stale":24,"active":23},"c21.ai-session-map","ai-session-map","Visualize a single AI agent session as a qmap entity-type topology","\u002Fcycles\u002Fqmap\u002Fc21-ai-session-map.png","2026-04-03",{"project":73,"projectLabel":74,"id":159,"num":97,"dir":377,"title":378,"focus":30,"status":47,"thumbnail":379,"started":380,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":349,"quietWeeks":97,"stale":24,"active":23},"c4.aii-agents-entity","AI Agents Entity","\u002Fcycles\u002Fbob-wire\u002Fc4-agent-sessions.png","2026-04-01",{"project":262,"projectLabel":263,"id":326,"num":327,"dir":382,"title":383,"focus":30,"status":47,"thumbnail":384,"started":385,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":334,"quietWeeks":97,"stale":24,"active":23},"c10.real-data","Real Data","\u002Fcycles\u002Fqflow\u002Fc10-devtools-iso.png","2026-03-23",{"project":262,"projectLabel":263,"id":203,"num":194,"dir":387,"title":388,"focus":30,"status":47,"thumbnail":389,"started":385,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":334,"quietWeeks":97,"stale":24,"active":23},"c8.label-controls","label controls","\u002Fcycles\u002Fqflow\u002Fc8-bottom-warm.png",{"project":73,"projectLabel":74,"id":165,"num":88,"dir":391,"title":392,"focus":30,"status":47,"thumbnail":393,"started":385,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":334,"quietWeeks":97,"stale":24,"active":23},"c3.dataflows","Dataflows","\u002Fcycles\u002Fbob-wire\u002Fc3-dataflows-overview.png",{"project":73,"projectLabel":74,"id":395,"num":21,"dir":396,"title":397,"focus":398,"status":47,"thumbnail":399,"started":400,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":401,"quietWeeks":97,"stale":24,"active":23},"c1","c1.situation-room","Situation Room","Situation Room wireframe — problem-space command center for data governance","\u002Fcycles\u002Fbob-wire\u002Fc1-index.png","2026-03-03",28,{"project":9,"projectLabel":10,"id":403,"num":404,"dir":405,"title":406,"focus":407,"status":408,"thumbnail":409,"started":410,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":152,"quietWeeks":105,"stale":24,"active":23},"c59",59,"c59.inventory","inventory","Design qdash inventory page to surface agent status and footprint at a glance","flagged","\u002Fcycles\u002Fdesign\u002Fc59-agent-detail-v2.png","2026-08-02",{"project":9,"projectLabel":10,"id":412,"num":413,"dir":414,"title":415,"focus":416,"status":408,"thumbnail":417,"started":418,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":342,"quietWeeks":105,"stale":24,"active":23},"c51",51,"c51.app-consolidation","App Consolidation","Understand the fractured qcontrol app ecosystem and consolidate it into a simple, clean, demoable product on a Nuxt + q-nuxt-layer front-end","\u002Farchive\u002F2026-q3\u002Fc51-consolidation-gaps.png","2026-07-14",{"project":420,"projectLabel":421,"id":422,"num":186,"dir":423,"title":424,"focus":30,"status":47,"thumbnail":30,"started":425,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":286,"quietWeeks":279,"stale":24,"active":23},"www","www.qpoint.io","c6","c6.combined-index","Combined Index Page","2026-05-27",{"project":420,"projectLabel":421,"id":159,"num":97,"dir":427,"title":428,"focus":30,"status":47,"thumbnail":30,"started":425,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":286,"quietWeeks":279,"stale":24,"active":23},"c4.case-studies","AI Agent Incident Case Studies",{"project":420,"projectLabel":421,"id":165,"num":88,"dir":430,"title":431,"focus":30,"status":47,"thumbnail":30,"started":425,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":286,"quietWeeks":279,"stale":24,"active":23},"c3.the-problem-page","The Problem Page + PocketOS Case Study",{"project":420,"projectLabel":421,"id":222,"num":105,"dir":433,"title":434,"focus":435,"status":47,"thumbnail":30,"started":436,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":215,"quietWeeks":279,"stale":24,"active":23},"c5.cookie-consent-audit","Cookie Consent Audit & Fix","Audit and fix cookie consent persistence so decisions survive deploys","2026-05-21",{"project":420,"projectLabel":421,"id":438,"num":50,"dir":439,"title":440,"focus":30,"status":47,"thumbnail":30,"started":441,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":215,"quietWeeks":286,"stale":24,"active":23},"c2","c2.brochure-site-q2","Brochure Site Q2 Redesign","2026-05-20",{"project":420,"projectLabel":421,"id":395,"num":21,"dir":443,"title":444,"focus":445,"status":47,"thumbnail":30,"started":296,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":273,"quietWeeks":286,"stale":24,"active":23},"c1.q-nuxt-layer-integration","Q Nuxt Layer Integration","Complete q-nuxt-layer integration for www.qpoint.io and deploy",{"project":73,"projectLabel":74,"id":62,"num":63,"dir":447,"title":448,"focus":30,"status":47,"thumbnail":30,"started":449,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":76,"quietWeeks":273,"stale":24,"active":23},"c11.pixel-character-system","Pixel Character System","2026-04-23",{"project":9,"projectLabel":10,"id":451,"num":452,"dir":453,"title":454,"focus":455,"status":408,"thumbnail":30,"started":339,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":76,"quietWeeks":273,"stale":24,"active":23},"c44",44,"c44.figma-ai-dashboard-redesign","Figma AI Dashboard Redesign","Establish a clean Figma-first source of truth for the dashboard redesign by modeling a flexible visual component API, then use AI to accelerate exploration without polluting the design system",{"project":9,"projectLabel":10,"id":457,"num":458,"dir":459,"title":460,"focus":461,"status":408,"thumbnail":30,"started":354,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":355,"quietWeeks":273,"stale":24,"active":23},"c42",42,"c42.runtime-session-map-publishing","Runtime Session Map Publishing","Define the design-app-native publish path for the qmap runtime-session map without starting implementation before qmap is ready",{"project":9,"projectLabel":10,"id":463,"num":464,"dir":465,"title":466,"focus":467,"status":408,"thumbnail":468,"started":354,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":355,"quietWeeks":273,"stale":24,"active":23},"c41",41,"c41.signal-column-flow","Signal Column Flow","Prototype a column-based evidence ladder that moves from noisy session signal to reduced entities, actions, and provisional outcomes","\u002Farchive\u002F2026-q3\u002Fc41-signal-column-flow.png",{"project":262,"projectLabel":263,"id":341,"num":342,"dir":470,"title":471,"focus":472,"status":47,"thumbnail":30,"started":473,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":315,"quietWeeks":349,"stale":24,"active":23},"c9.dev-tools-integration","c9 · dev-tools-integration","Integrate qflow with qtap dev-tools in app.qpoint.io — qflow as bird's-eye view, dev-tools as detail inspector, fed by live production SSE traffic.","2026-03-16",{"project":9,"projectLabel":10,"id":203,"num":194,"dir":475,"title":476,"focus":30,"status":47,"thumbnail":30,"started":477,"startedSource":32,"closed":30,"closedSource":30,"openWeeks":307,"quietWeeks":315,"stale":24,"active":23},"c8.sharing-design-philosophy","Sharing Design Philosophy","2026-03-13",{"project":479,"projectLabel":480,"id":438,"num":50,"dir":481,"title":482,"focus":483,"status":47,"thumbnail":30,"started":484,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":401,"quietWeeks":315,"stale":24,"active":23},"app","app.qpoint.io","c2.mcp-apps","MCP Apps","Add AI assistant UI to app.qpoint.io with shared Vue components usable as MCP Apps","2026-03-05",{"project":479,"projectLabel":480,"id":395,"num":21,"dir":486,"title":487,"focus":488,"status":47,"thumbnail":30,"started":489,"startedSource":19,"closed":30,"closedSource":30,"openWeeks":170,"quietWeeks":315,"stale":24,"active":23},"c1.documentation-cleanup","documentation-cleanup","Improve component documentation quality with better examples and human-AI collaborative workflow","2026-02-19",[491],{"project":9,"projectLabel":10,"id":26,"num":27,"dir":28,"title":29,"focus":30,"status":31,"thumbnail":30,"started":18,"startedSource":32,"closed":18,"closedSource":32,"openWeeks":21,"quietWeeks":22,"stale":23,"active":24},[493,626,722,877,1016],{"project":9,"cycle":34,"dir":36,"title":37,"date":18,"lead":30,"long":24,"ast":494},{"type":495,"children":496},"root",[497],{"type":498,"tag":499,"props":500,"children":501},"element","ul",{},[502],{"type":498,"tag":503,"props":504,"children":505},"li",{},[506,513,515,522,524,530,532,538,540,546,548,554,556,562,564,570,572,578,580,586,588,594,595,600,602,608,610,616,618,624],{"type":498,"tag":507,"props":508,"children":509},"strong",{},[510],{"type":511,"value":512},"text","2026-09-11:",{"type":511,"value":514}," Built the ",{"type":498,"tag":516,"props":517,"children":519},"code",{"className":518},[],[520],{"type":511,"value":521},"transcript",{"type":511,"value":523}," namespace: ",{"type":498,"tag":516,"props":525,"children":527},{"className":526},[],[528],{"type":511,"value":529},"TranscriptPanel",{"type":511,"value":531}," (card shell,\nturn count, navigator + turn stack, scroll-to-turn), ",{"type":498,"tag":516,"props":533,"children":535},{"className":534},[],[536],{"type":511,"value":537},"TranscriptNavigator",{"type":511,"value":539}," (tick\nrail with a hover-distance-based flyout, truncation via line-clamp),\n",{"type":498,"tag":516,"props":541,"children":543},{"className":542},[],[544],{"type":511,"value":545},"TranscriptTurn",{"type":511,"value":547},"\u002F",{"type":498,"tag":516,"props":549,"children":551},{"className":550},[],[552],{"type":511,"value":553},"TranscriptMessage",{"type":511,"value":555}," (one bubble per speaker message, right-aligned\nwith ",{"type":498,"tag":516,"props":557,"children":559},{"className":558},[],[560],{"type":511,"value":561},"UxAvatar",{"type":511,"value":563}," for the user, left-aligned with an inline ",{"type":498,"tag":516,"props":565,"children":567},{"className":566},[],[568],{"type":511,"value":569},"AgentPawn",{"type":511,"value":571}," for the\nagent), ",{"type":498,"tag":516,"props":573,"children":575},{"className":574},[],[576],{"type":511,"value":577},"TranscriptToolCall",{"type":511,"value":579}," (collapsed row → expanded input\u002Fcontent\u002Foutput\nmonospace block, local ",{"type":498,"tag":516,"props":581,"children":583},{"className":582},[],[584],{"type":511,"value":585},"expanded",{"type":511,"value":587}," ref). Resolved the initial prompt's flagged\n",{"type":498,"tag":516,"props":589,"children":591},{"className":590},[],[592],{"type":511,"value":593},"items",{"type":511,"value":547},{"type":498,"tag":516,"props":596,"children":598},{"className":597},[],[599],{"type":511,"value":593},{"type":511,"value":601}," naming collision as ",{"type":498,"tag":516,"props":603,"children":605},{"className":604},[],[606],{"type":511,"value":607},"parts",{"type":511,"value":609}," (message content) vs ",{"type":498,"tag":516,"props":611,"children":613},{"className":612},[],[614],{"type":511,"value":615},"messages",{"type":511,"value":617},"\n(turn's speaker groups). Renamed the stale, uncommitted \"c85. Phase-2 Pages\"\nentry in ",{"type":498,"tag":516,"props":619,"children":621},{"className":620},[],[622],{"type":511,"value":623},"cycles\u002FCYCLES.md",{"type":511,"value":625}," to this cycle. Verified all four demo states\n(empty\u002Fminimal\u002Ftypical\u002Foverflow) and the tool-call expand + navigator hover\ninteractions via Playwright against the running dev server.",{"project":9,"cycle":34,"dir":36,"title":37,"date":18,"lead":627,"long":24,"ast":628},"(follow-up)",{"type":495,"children":629},[630],{"type":498,"tag":499,"props":631,"children":632},{},[633],{"type":498,"tag":503,"props":634,"children":635},{},[636,641,643,649,651,657,659,664,666,672,674,680,682,688,690,696,698,704,706,712,714,720],{"type":498,"tag":507,"props":637,"children":638},{},[639],{"type":511,"value":640},"2026-09-11 (follow-up):",{"type":511,"value":642}," Tightened fidelity to the reference sketch —\nentity icon inline at the bubble's bottom corner (was stacked below), monospace\nchat\u002Ftool-call text, no purple bubble background. Reworked the navigator: no\ndead space between tick rows (clicks now target whichever turn currently has\nthe most cursor-proximity influence, not the exact row under the pointer),\nhover fan replaced a per-tick rotate effect with width-only growth (rotation\nread as noise, not signal), and centered the rail on the panel's own height via\nflex rather than a ",{"type":498,"tag":516,"props":644,"children":646},{"className":645},[],[647],{"type":511,"value":648},"translateY",{"type":511,"value":650}," transform (a transform on an ancestor traps a\n",{"type":498,"tag":516,"props":652,"children":654},{"className":653},[],[655],{"type":511,"value":656},"position:fixed",{"type":511,"value":658}," descendant in that ancestor's box — broke the flyout).\n",{"type":498,"tag":516,"props":660,"children":662},{"className":661},[],[663],{"type":511,"value":529},{"type":511,"value":665}," became self-contained:\n",{"type":498,"tag":516,"props":667,"children":669},{"className":668},[],[670],{"type":511,"value":671},"flex flex-col h-full",{"type":511,"value":673}," + ",{"type":498,"tag":516,"props":675,"children":677},{"className":676},[],[678],{"type":511,"value":679},"minHeight",{"type":511,"value":681}," prop, internal ",{"type":498,"tag":516,"props":683,"children":685},{"className":684},[],[686],{"type":511,"value":687},"overflow-y-auto",{"type":511,"value":689}," turn list\nso the panel (not the page) owns its own scroll — ",{"type":498,"tag":516,"props":691,"children":693},{"className":692},[],[694],{"type":511,"value":695},"scrollToTurn",{"type":511,"value":697}," now scrolls\nthat container directly instead of ",{"type":498,"tag":516,"props":699,"children":701},{"className":700},[],[702],{"type":511,"value":703},"scrollIntoView()",{"type":511,"value":705},", which was also dragging\nthe outer page (and the panel's own header) along with it. Fixed one real\nlayer-gotcha violation found in cleanup: ",{"type":498,"tag":516,"props":707,"children":709},{"className":708},[],[710],{"type":511,"value":711},"max-w-[560px]",{"type":511,"value":713}," (arbitrary Tailwind\nvalue, unreliably scanned in layer components) → inline ",{"type":498,"tag":516,"props":715,"children":717},{"className":716},[],[718],{"type":511,"value":719},"style=\"max-width: 560px\"",{"type":511,"value":721},".",{"project":9,"cycle":34,"dir":36,"title":37,"date":18,"lead":723,"long":24,"ast":724},"(design revisions + documentation)",{"type":495,"children":725},[726],{"type":498,"tag":499,"props":727,"children":728},{},[729],{"type":498,"tag":503,"props":730,"children":731},{},[732,737,739,745,747,753,755,761,762,768,770,776,778,784,786,792,794,799,801,806,808,814,816,822,824,830,831,837,839,845,847,853,855,860,862,867,869,875],{"type":498,"tag":507,"props":733,"children":734},{},[735],{"type":511,"value":736},"2026-09-11 (design revisions + documentation):",{"type":511,"value":738}," Iterated the message\nbubble's tail through three techniques before landing: a thin SVG line\n(matched the hand sketch's stroke but couldn't read as attached), a\nCSS-border triangle glued to the bubble corner (a proper wedge, but\nreached for the avatar rather than sitting flush), then Mark's skewed-square\nborder-trick (ported faithfully — colors read the same ",{"type":498,"tag":516,"props":740,"children":742},{"className":741},[],[743],{"type":511,"value":744},"--qp-surface",{"type":511,"value":746},"\u002F\n",{"type":498,"tag":516,"props":748,"children":750},{"className":749},[],[751],{"type":511,"value":752},"--qp-stroke",{"type":511,"value":754}," custom properties Tailwind's ",{"type":498,"tag":516,"props":756,"children":758},{"className":757},[],[759],{"type":511,"value":760},"bg-surface",{"type":511,"value":547},{"type":498,"tag":516,"props":763,"children":765},{"className":764},[],[766],{"type":511,"value":767},"border-stroke",{"type":511,"value":769},"\nresolve to, since this repo drives theming through those vars rather than\na ",{"type":498,"tag":516,"props":771,"children":773},{"className":772},[],[774],{"type":511,"value":775},"dark:",{"type":511,"value":777}," class). Fixed a real bug surfaced along the way: ",{"type":498,"tag":516,"props":779,"children":781},{"className":780},[],[782],{"type":511,"value":783},"flex-row-reverse",{"type":511,"value":785},"\nhad user\u002Fagent swapped relative to what the bubble's corner-cuts assumed,\nso identity marks sat on the wrong side of their bubble. Polish pass:\nthicker\u002Fmore padded bubbles, ",{"type":498,"tag":516,"props":787,"children":789},{"className":788},[],[790],{"type":511,"value":791},"shrink-0",{"type":511,"value":793}," + a floor-clearing ",{"type":498,"tag":516,"props":795,"children":797},{"className":796},[],[798],{"type":511,"value":648},{"type":511,"value":800}," on\nthe identity marks so they don't compress or overlap the tail. Swapped\n",{"type":498,"tag":516,"props":802,"children":804},{"className":803},[],[805],{"type":511,"value":529},{"type":511,"value":807},"'s ",{"type":498,"tag":516,"props":809,"children":811},{"className":810},[],[812],{"type":511,"value":813},"h-full",{"type":511,"value":815}," for ",{"type":498,"tag":516,"props":817,"children":819},{"className":818},[],[820],{"type":511,"value":821},"max-h-full",{"type":511,"value":823}," so a short transcript\nshrink-wraps to content instead of always stretching to fill the ancestor's\nheight — ",{"type":498,"tag":516,"props":825,"children":827},{"className":826},[],[828],{"type":511,"value":829},"flex-1",{"type":511,"value":547},{"type":498,"tag":516,"props":832,"children":834},{"className":833},[],[835],{"type":511,"value":836},"min-h-0",{"type":511,"value":838}," still caps and scrolls once content exceeds it,\nno conflict between the two behaviors. Hid the navigator (and its reserved\ngutter) when a transcript has only one turn, since there's nothing to\nnavigate between. Documented all five components on ",{"type":498,"tag":516,"props":840,"children":842},{"className":841},[],[843],{"type":511,"value":844},"\u002Fcomponents",{"type":511,"value":846}," via the\n",{"type":498,"tag":516,"props":848,"children":850},{"className":849},[],[851],{"type":511,"value":852},"document-components",{"type":511,"value":854}," skill: new ",{"type":498,"tag":516,"props":856,"children":858},{"className":857},[],[859],{"type":511,"value":521},{"type":511,"value":861}," registry group, one demo file\nper component (",{"type":498,"tag":516,"props":863,"children":865},{"className":864},[],[866],{"type":511,"value":529},{"type":511,"value":868},"'s reuses the four ",{"type":498,"tag":516,"props":870,"children":872},{"className":871},[],[873],{"type":511,"value":874},"\u002Fpages",{"type":511,"value":876}," fixtures behind\na state toggle), and a Visual-view thumbnail.",{"project":9,"cycle":34,"dir":36,"title":37,"date":18,"lead":878,"long":24,"ast":879},"(sizing bug)",{"type":495,"children":880},[881],{"type":498,"tag":499,"props":882,"children":883},{},[884],{"type":498,"tag":503,"props":885,"children":886},{},[887,892,894,899,901,906,908,914,916,922,924,930,932,938,940,946,948,954,955,961,962,968,970,976,978,983,985,991,993,999,1001,1007,1009,1014],{"type":498,"tag":507,"props":888,"children":889},{},[890],{"type":511,"value":891},"2026-09-11 (sizing bug):",{"type":511,"value":893}," The ",{"type":498,"tag":516,"props":895,"children":897},{"className":896},[],[898],{"type":511,"value":821},{"type":511,"value":900}," shrink-to-fit change above\nhad two real bugs, both found on the doc page (a taller viewport made them\nobvious). Internal scroll: the scroller's ",{"type":498,"tag":516,"props":902,"children":904},{"className":903},[],[905],{"type":511,"value":813},{"type":511,"value":907}," silently grew to content\nheight instead of clamping — a ",{"type":498,"tag":516,"props":909,"children":911},{"className":910},[],[912],{"type":511,"value":913},"max-height",{"type":511,"value":915},"-derived parent size isn't\nreliably \"definite\" enough for a nested percentage-height child — so\noverflow never triggered and content just got clipped by the panel's own\n",{"type":498,"tag":516,"props":917,"children":919},{"className":918},[],[920],{"type":511,"value":921},"overflow-hidden",{"type":511,"value":923},". First fix attempt (",{"type":498,"tag":516,"props":925,"children":927},{"className":926},[],[928],{"type":511,"value":929},"position: absolute",{"type":511,"value":931}," on the scroller)\ntraded that bug for a worse one: absolutely-positioned content doesn't\ncount toward an ancestor's auto\u002Fcontent-based height, so short transcripts\ncollapsed to just the header. Tried ",{"type":498,"tag":516,"props":933,"children":935},{"className":934},[],[936],{"type":511,"value":937},"height: clamp(minHeight, max-content, 100%)",{"type":511,"value":939}," next — invalid CSS (",{"type":498,"tag":516,"props":941,"children":943},{"className":942},[],[944],{"type":511,"value":945},"max-content",{"type":511,"value":947}," isn't a valid argument inside\n",{"type":498,"tag":516,"props":949,"children":951},{"className":950},[],[952],{"type":511,"value":953},"clamp()",{"type":511,"value":547},{"type":498,"tag":516,"props":956,"children":958},{"className":957},[],[959],{"type":511,"value":960},"min()",{"type":511,"value":547},{"type":498,"tag":516,"props":963,"children":965},{"className":964},[],[966],{"type":511,"value":967},"max()",{"type":511,"value":969},", only lengths\u002Fpercentages are), silently dropped,\nheight fell back to unbounded ",{"type":498,"tag":516,"props":971,"children":973},{"className":972},[],[974],{"type":511,"value":975},"auto",{"type":511,"value":977},". Landed on ",{"type":498,"tag":516,"props":979,"children":981},{"className":980},[],[982],{"type":511,"value":821},{"type":511,"value":984}," (unchanged)\npaired with a normal in-flow ",{"type":498,"tag":516,"props":986,"children":988},{"className":987},[],[989],{"type":511,"value":990},"flex-1 min-h-0",{"type":511,"value":992}," scroller instead of the old\n",{"type":498,"tag":516,"props":994,"children":996},{"className":995},[],[997],{"type":511,"value":998},"relative",{"type":511,"value":1000}," + two absolutely-positioned children layout — verified all four\nfixture states hit the right number (960px capped+scrolling for\nTypical\u002FOverflow, 480px floor for Minimal\u002FEmpty) at a 1600px-tall viewport.\nAlso added a ",{"type":498,"tag":516,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":511,"value":1006},"max-width: 640px",{"type":511,"value":1008}," wrap on the doc-page demo instance only —\n",{"type":498,"tag":516,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":511,"value":529},{"type":511,"value":1015}," itself stays unconstrained\u002Ffill-width by default.",{"project":9,"cycle":11,"dir":13,"title":14,"date":18,"lead":30,"long":24,"ast":1017},{"type":495,"children":1018},[1019],{"type":498,"tag":499,"props":1020,"children":1021},{},[1022],{"type":498,"tag":503,"props":1023,"children":1024},{},[1025,1029,1030,1036,1038,1044,1046,1052,1054,1060,1062,1068,1070,1076,1078,1083,1085,1091,1093,1099,1101,1107,1109,1115,1117,1123,1125,1130,1132,1138,1139,1145,1147,1153,1155,1161,1163,1169,1171,1177,1179,1185,1187,1193,1195,1200,1202,1208,1210,1216,1218,1224,1226,1231,1232,1237,1239,1245,1247,1252,1254,1260,1262,1268,1270,1276,1278,1283,1285,1290,1291,1297,1299,1305,1307,1312,1313,1319,1321,1327,1329,1335,1337,1343,1344,1350,1351,1356,1358,1363,1365,1371,1373,1379,1381,1387,1389,1395,1397,1403,1405,1410,1412,1417,1419,1425,1427,1433,1435,1441],{"type":498,"tag":507,"props":1026,"children":1027},{},[1028],{"type":511,"value":512},{"type":511,"value":514},{"type":498,"tag":516,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":511,"value":1035},"history-graph",{"type":511,"value":1037}," namespace on top of ",{"type":498,"tag":516,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":511,"value":1043},"DonutChart",{"type":511,"value":1045},"'s\npalette\u002Flegend precedent. The mock's black\u002Fblue\u002Fgrey don't map to existing\nsemantic tokens (no true blue token; a literal neutral gray always fails the\ndataviz validator's chroma floor by construction — that check exists\nspecifically to keep \"reads as gray\" colors out of categorical data, so the\nthird slot is a validated muted sage rather than literal gray). Landed the\nstacked-unit algorithm: a shared \"nice\" unit value keeps the tallest column\nunder the block cap across any range, with auto-fallback to continuous bars\npast 40 columns (verified against the 60-day fixture) — reusing the same\npx-per-value scale in both modes so bar mode reads as the continuous version\nof the same chart, not a different one. Found and fixed two real bugs via\nPlaywright verification against the running dev server: (1) a date-only ISO\nstring (\"2026-09-07\") parses as UTC midnight, which showed the previous\nweekday in any timezone behind UTC — fixed by treating bare date strings as\nlocal calendar days; (2) resolving series color reactively from\n",{"type":498,"tag":516,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":511,"value":1051},"colorScheme.value",{"type":511,"value":1053}," (needed since these are literal hexes, not ",{"type":498,"tag":516,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":511,"value":1059},"qp()",{"type":511,"value":1061}," CSS\nvars) hit the exact SSR\u002Fhydration-mismatch case ",{"type":498,"tag":516,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":511,"value":1067},"ThemeToggle.vue",{"type":511,"value":1069}," already\ndocuments — fixed with the same ",{"type":498,"tag":516,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":511,"value":1075},"mounted",{"type":511,"value":1077},"-gated pattern, verified by loading\nthe page fresh with dark mode already stored (not just toggling live).\nMark then flagged that columns were stretching to fill wide containers\n(",{"type":498,"tag":516,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":511,"value":829},{"type":511,"value":1084}," on both the columns row and each column) instead of sitting at\ntheir natural pictogram size — discussed two options and chose \"fixed width\nthat can shrink but never grow\" over \"always fixed\" so a 7-day chart stays\ncompact while a 60-day one still compresses to fit. Landed as an explicit\nper-format ",{"type":498,"tag":516,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":511,"value":1090},"columnWidth",{"type":511,"value":1092}," (28\u002F24\u002F42px for weekday\u002Fday\u002Fdate) on ",{"type":498,"tag":516,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":511,"value":1098},"flex: 0 1 \u003Cwidth>px",{"type":511,"value":1100},". Hit a second, subtler bug getting there: the columns wrapper's\nown ",{"type":498,"tag":516,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":511,"value":1106},"flex-basis: auto",{"type":511,"value":1108}," didn't reliably resolve to the sum of its children's\nexplicit flex-basis values — a flex item that's itself a flex container\ndoesn't reliably auto-size that way, worse with ",{"type":498,"tag":516,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":511,"value":1114},"min-w-0",{"type":511,"value":1116}," in play — so\ncolumns silently shrank to ~19px with truncated labels even with acres of\nfree space. Fixed by computing the wrapper's own width explicitly\n(",{"type":498,"tag":516,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":511,"value":1122},"n × columnWidth + gaps",{"type":511,"value":1124},") instead of trusting ",{"type":498,"tag":516,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":511,"value":975},{"type":511,"value":1131},". Mark also asked for\nsquare (not rounded) blocks and for block size \u002F vertical gap between\nstacked blocks to be real props rather than baked-in constants — added\n",{"type":498,"tag":516,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":511,"value":1137},"blockSize",{"type":511,"value":547},{"type":498,"tag":516,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":511,"value":1144},"blockGap",{"type":511,"value":1146}," (defaults 6px\u002F2px, down from the previous fixed\n8px\u002F4px) threaded from ",{"type":498,"tag":516,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":511,"value":1152},"DataHistoryGraph",{"type":511,"value":1154}," through ",{"type":498,"tag":516,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":511,"value":1160},"Column",{"type":511,"value":1162}," to ",{"type":498,"tag":516,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":511,"value":1168},"Block",{"type":511,"value":1170},", with\nthe unit-scaling pitch (",{"type":498,"tag":516,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":511,"value":1176},"blockSize + blockGap",{"type":511,"value":1178},") now derived from them\ninstead of a hardcoded 12, and dropped ",{"type":498,"tag":516,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":511,"value":1184},"rounded-sm",{"type":511,"value":1186}," from both blocks and\nbar-mode segments. Finally, Mark flagged (with a corrected reference image)\nthat series should render as independent side-by-side lanes per day, not\nsummed into one stacked column — reversing this session's earlier read of\nthe mock. Reworked the scaling to key off the tallest ",{"type":498,"tag":1188,"props":1189,"children":1190},"em",{},[1191],{"type":511,"value":1192},"single-series",{"type":511,"value":1194}," value\n(not the per-day sum), since lanes no longer share a column's height\nbudget, and ",{"type":498,"tag":516,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":511,"value":1160},{"type":511,"value":1201}," now renders one fixed-width lane per series\n(",{"type":498,"tag":516,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":511,"value":1207},"flex-col-reverse",{"type":511,"value":1209},", its own baseline-aligned stack) inside a centered row,\ninstead of one interleaved stack. Column width now also accounts for the\nlanes' combined width (",{"type":498,"tag":516,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":511,"value":1215},"seriesCount × blockSize + gaps",{"type":511,"value":1217},"), not just the\nlabel's needs, so charts with more series than a short label can fit don't\ncrowd their lanes. Last, promoted the previously-hardcoded 8px gap between\nday columns to a ",{"type":498,"tag":516,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":511,"value":1223},"dayGap",{"type":511,"value":1225}," prop (default unchanged at 8px) alongside\n",{"type":498,"tag":516,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":511,"value":1137},{"type":511,"value":547},{"type":498,"tag":516,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":511,"value":1144},{"type":511,"value":1238},", replacing the static ",{"type":498,"tag":516,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":511,"value":1244},"gap-2",{"type":511,"value":1246}," Tailwind class with an\ninline style bound to the prop. Mark then reported ",{"type":498,"tag":516,"props":1248,"children":1250},{"className":1249},[],[1251],{"type":511,"value":1137},{"type":511,"value":1253}," causing\n\"massive top padding\" when increased on the demo's slider — root cause was\nthe shared ",{"type":498,"tag":516,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":511,"value":1259},"dev\u002Fmeta\u002FPropsMachine.vue",{"type":511,"value":1261}," control's range\u002Ftext ",{"type":498,"tag":516,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":511,"value":1267},"v-model",{"type":511,"value":1269},"\nlacking a ",{"type":498,"tag":516,"props":1271,"children":1273},{"className":1272},[],[1274],{"type":511,"value":1275},".number",{"type":511,"value":1277}," modifier, so an edited numeric adminProp arrives as a\n",{"type":498,"tag":1188,"props":1279,"children":1280},{},[1281],{"type":511,"value":1282},"string",{"type":511,"value":1284},"; ",{"type":498,"tag":516,"props":1286,"children":1288},{"className":1287},[],[1289],{"type":511,"value":1160},{"type":511,"value":807},{"type":498,"tag":516,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":511,"value":1296},"pitch = props.blockSize + props.blockGap",{"type":511,"value":1298}," then did\nstring concatenation (\"16\" + 2 -> \"162\") instead of addition, and\n",{"type":498,"tag":516,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":511,"value":1304},"areaHeight = maxUnits × \"162\"",{"type":511,"value":1306}," re-coerced through multiplication to 972px\nfor a chart that should have been 108px. ",{"type":498,"tag":516,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":511,"value":1090},{"type":511,"value":547},{"type":498,"tag":516,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":511,"value":1318},"columnsAreaWidth",{"type":511,"value":1320},"\nwere already safe (their ",{"type":498,"tag":516,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":511,"value":1326},"+",{"type":511,"value":1328}," only ever combines two products, which forces\nnumeric coercion first) — fixed the one unsafe line with explicit\n",{"type":498,"tag":516,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":511,"value":1334},"Number(...)",{"type":511,"value":1336}," rather than touching the shared dev tool, which other\nconsumers apparently avoid tripping since they use ",{"type":498,"tag":516,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":511,"value":1342},"-",{"type":511,"value":547},{"type":498,"tag":516,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":511,"value":1349},"*",{"type":511,"value":547},{"type":498,"tag":516,"props":1352,"children":1354},{"className":1353},[],[1355],{"type":511,"value":547},{"type":511,"value":1357}," on their\nnumeric adminProps, never a bare ",{"type":498,"tag":516,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":511,"value":1326},{"type":511,"value":1364},". Rounded out the sizing props with\n",{"type":498,"tag":516,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":511,"value":1370},"labelSize",{"type":511,"value":1372}," (default 11px, matching the previous hardcoded ",{"type":498,"tag":516,"props":1374,"children":1376},{"className":1375},[],[1377],{"type":511,"value":1378},"text-11",{"type":511,"value":1380},") —\nthe label-driven minimum column width (",{"type":498,"tag":516,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":511,"value":1386},"LABEL_COLUMN_WIDTH",{"type":511,"value":1388},") now scales\nproportionally with it so a bigger label doesn't truncate against a width\ncalibrated for the old fixed 11px. Mark then caught a large empty gap under\n",{"type":498,"tag":516,"props":1390,"children":1392},{"className":1391},[],[1393],{"type":511,"value":1394},"legendBelow",{"type":511,"value":1396}," — the columns wrapper sized itself with ",{"type":498,"tag":516,"props":1398,"children":1400},{"className":1399},[],[1401],{"type":511,"value":1402},"flex: 0 1 Xpx",{"type":511,"value":1404},",\nand flex-basis follows the flex container's ",{"type":498,"tag":1188,"props":1406,"children":1407},{},[1408],{"type":511,"value":1409},"main axis",{"type":511,"value":1411},"; toggling\n",{"type":498,"tag":516,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":511,"value":1394},{"type":511,"value":1418}," switches that axis from row to column, so the same Xpx\n(a width) was being applied as a height instead once the layout went\nvertical. Fixed by using ",{"type":498,"tag":516,"props":1420,"children":1422},{"className":1421},[],[1423],{"type":511,"value":1424},"width: Xpx",{"type":511,"value":1426}," directly, which is axis-independent\nand (via flex-basis:auto falling back to the width property) behaves\nidentically to the old row-mode shrink behavior while also being correct\nin column mode. Last, linked the legend's label size to ",{"type":498,"tag":516,"props":1428,"children":1430},{"className":1429},[],[1431],{"type":511,"value":1432},"labelSize + 1",{"type":511,"value":1434},"\nrather than a hardcoded ",{"type":498,"tag":516,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":511,"value":1440},"text-15",{"type":511,"value":721},[1443,1465,1493,1503],{"id":9,"label":10,"commits":1444},[1445,1448,1451,1455,1458,1461],{"repo":9,"sha":1446,"date":18,"subject":1447,"pr":30},"52e3b1e000","Bump q-nuxt-layer to 0.9.12: DataHistoryGraph props\u002Fdocs + layout fixes",{"repo":9,"sha":1449,"date":18,"subject":1450,"pr":30},"0e5f158203","transcript window, history graph",{"repo":9,"sha":1452,"date":1453,"subject":1454,"pr":30},"d4752306b5","2026-09-09","Merge branch 'main' of https:\u002F\u002Fgithub.com\u002Fqpoint-io\u002Fdesign",{"repo":9,"sha":1456,"date":1453,"subject":1457,"pr":30},"d36162306b","deploying the lates",{"repo":9,"sha":1459,"date":1453,"subject":1460,"pr":30},"4e4231e9c7","ci: run the build on pushes to main as well",{"repo":9,"sha":1462,"date":1463,"subject":1464,"pr":30},"a98560415e","2026-09-08","c81: second iteration on 4 Phase-1 pages from the Mark Peterson walkthrough",{"id":1466,"label":1466,"commits":1467},"qcontrol",[1468,1472,1477,1481,1485,1489],{"repo":1466,"sha":1469,"date":5,"subject":1470,"pr":1471},"98284a942","Windows monitor worker parity (#695)",695,{"repo":1466,"sha":1473,"date":1474,"subject":1475,"pr":1476},"5363aeede","2026-09-10","Findings Page Refinements (#667)",667,{"repo":1466,"sha":1478,"date":1463,"subject":1479,"pr":1480},"f84d2af5e","Move run runtime into monitor-managed workers (#689)",689,{"repo":1466,"sha":1482,"date":4,"subject":1483,"pr":1484},"d4986c446","Add minimal private worker lifecycle (#688)",688,{"repo":1466,"sha":1486,"date":4,"subject":1487,"pr":1488},"a11ca1d4d","Broker run-session MCP snapshots through the monitor (#687)",687,{"repo":1466,"sha":1490,"date":4,"subject":1491,"pr":1492},"a4611867b","cli: make tap and untap monitor-only clients (#686)",686,{"id":1494,"label":1495,"commits":1496},"layer","q-nuxt-layer",[1497,1500],{"repo":1494,"sha":1498,"date":18,"subject":1499,"pr":30},"a04133d","v0.9.12: DataHistoryGraph + Transcript components (c85, c87)",{"repo":1494,"sha":1501,"date":18,"subject":1502,"pr":30},"7bbb45c","DataHistoryGraph + Transcript components: pictogram history chart (c87) and chat-transcript panel (c85)",{"id":1504,"label":1504,"commits":1505},"qtap",[1506,1510,1514,1518,1522,1526,1530,1534,1538,1542],{"repo":1504,"sha":1507,"date":18,"subject":1508,"pr":1509},"2818071","decouple container eventer (#376)",376,{"repo":1504,"sha":1511,"date":18,"subject":1512,"pr":1513},"7dd6680","decouple process eventer (#375)",375,{"repo":1504,"sha":1515,"date":1453,"subject":1516,"pr":1517},"3485058","bumps sharp to fix dependabot alert 80 (#374)",374,{"repo":1504,"sha":1519,"date":1453,"subject":1520,"pr":1521},"00e3563","fixes docker readme example (#373)",373,{"repo":1504,"sha":1523,"date":1453,"subject":1524,"pr":1525},"d199997","chore(deps): bump google.golang.org\u002Fgrpc (#372)",372,{"repo":1504,"sha":1527,"date":1453,"subject":1528,"pr":1529},"38d8426","fixes security findings for unimported packages (#371)",371,{"repo":1504,"sha":1531,"date":1463,"subject":1532,"pr":1533},"fea9e3c","Update generated offsets (#368)",368,{"repo":1504,"sha":1535,"date":1463,"subject":1536,"pr":1537},"13a1b3d","updates vite plugins for vite 8 (#366)",366,{"repo":1504,"sha":1539,"date":1463,"subject":1540,"pr":1541},"c9e831d","migrates docker client to moby\u002Fmoby + drops docker\u002Fdocker allowlist entries (#369)",369,{"repo":1504,"sha":1543,"date":1463,"subject":1544,"pr":1545},"82504a6","bumps testcontainers-go to v0.44.0 + moves e2e to moby\u002Fmoby api types (#367)",367,[1547],{"tag":1548,"date":18,"subject":1499},"v0.9.12",[],[],[],[],[1554],"Deploys come from this checkout's deploy-branch reflog, which starts 2026-10-16.","2026-09-14",1794599489823]