product-planning(同步 26 改 65 新)
- 目录约定:docs/pm/<项目>/ ⇒ <工作区>/项目/<产品slug>/ 为产品根,下分 产品规划/ 与 产品原型/{designs,pages}
- ④段骨架六节 ⇒ 七节(新增「原型地址」;后两节改「页面导航」「原型状态取值」)
- ③段新增真机组件库;结案「源站只有暗色主题」,tokens.css(亮色)标为不可用于生产
- ③段改版规则反转为「一个产品只用一套原型、只留当前态」;②段新增 产品规划模板.md(表头唯一定义处)
- scripts:产品根定位重写(含 .registry/current-project 指针),新增 check_terms.py 与 selftest_product_root.py
session-mechanism(同步 3 改 2 新)
- references/06-技能优化规程.md 新增 §5「要求落在生成时看得见的面上」,总表 16 ⇒ 17 条;SKILL.md 同步
- scripts/collabctl.py 取回 _find_board() 候选定位(旧版写死 scripts/board.py,而看板已搬进 boards/会话看板/ ⇒ 旧版本就是坏的)
element-picker(新装)
- 按用户口径作「独立功能加入 product-planning」,非独立全局技能
- 修掉它自身三处路径漂移(技能根写法 ⇒ 同目录;README 两处旧落点;剪贴板示例文案与代码对齐)
工具归拢到技能级 assets/
- diagram-design / design-capture / element-picker / video-capture 从各段 assets/ 移到技能包 assets/
- 新增红线:本包有两处 assets/(技能级工具箱 vs 段内资产),引工具一律写「技能级 assets/<工具名>/」
- 路径口径由两类改三类(技能级工具箱 / 本段自带资产 / 同根技能)
不入库(磁盘保留)
- design-system-tiaoyue 整个目录(用户 2026-10-16 令):git rm -r --cached + .gitignore,理由=14 MB 且可 CDP 重采;
已在 ③段 SKILL.md 注明「取仓后这一层是空的属正常,用自带套需另取或重采」
- element-picker 的运行期存档 marks/(服务自己会建目录)
101 lines
6.7 KiB
HTML
101 lines
6.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
<title>The self-improving loop · Dark</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet"/>
|
|
<style>
|
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
:root {
|
|
--paper: #2d3142; --ink: #f5f5f5; --muted: #bfc0c0; --soft: #8e98ac;
|
|
--accent: #f08a59; --accent-tint: rgba(240,138,89,0.10); --link: #6a95d8;
|
|
--sans: 'Geist', system-ui, sans-serif; --serif: 'Instrument Serif', serif;
|
|
--mono: 'Geist Mono', ui-monospace, monospace;
|
|
}
|
|
body { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 3rem 2rem; background: var(--paper); color: var(--ink); font-family: var(--sans); }
|
|
.frame { width: 100%; max-width: 1200px; }
|
|
.eyebrow { margin-bottom: 0.5rem; color: var(--muted); font: 500 0.66rem var(--mono); letter-spacing: 0.18em; text-transform: uppercase; }
|
|
h1 { margin-bottom: 1.5rem; color: var(--ink); font: 400 clamp(1.5rem, 2.4vw + 0.75rem, 2rem)/1.15 var(--serif); letter-spacing: -0.02em; }
|
|
svg { display: block; width: 100%; min-width: 900px; }
|
|
.ring { fill: none; stroke: var(--muted); stroke-width: 1.2; }
|
|
.spoke { fill: none; stroke: var(--soft); stroke-width: 1; stroke-dasharray: 5 4; }
|
|
.station { fill: var(--paper); stroke: var(--ink); stroke-width: 1; }
|
|
.station.focal { fill: var(--accent-tint); stroke: var(--accent); stroke-width: 1.2; }
|
|
.hub { fill: var(--ink); }
|
|
.node-name { fill: var(--ink); font: 600 12px var(--sans); text-anchor: middle; }
|
|
.focal-name { fill: var(--accent); }
|
|
.sublabel { fill: var(--soft); font: 400 8px var(--mono); text-anchor: middle; }
|
|
.hub-name { fill: var(--paper); font: 600 16px var(--sans); text-anchor: middle; }
|
|
.hub-sub { fill: var(--paper); opacity: 0.72; font: 400 8px var(--mono); text-anchor: middle; }
|
|
.arrow-label { fill: var(--soft); font: 400 8px var(--mono); letter-spacing: 0.06em; text-anchor: middle; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<main class="frame">
|
|
<p class="eyebrow">Loop · Diagram Design</p>
|
|
<h1>The self-improving loop</h1>
|
|
|
|
<svg viewBox="0 0 1040 680" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="loop-dark-title loop-dark-desc">
|
|
<title id="loop-dark-title">The self-improving loop</title>
|
|
<desc id="loop-dark-desc">Six stations flow clockwise from Capture through Learn and back to Capture. Each station writes shared state into one central memory hub, with Decide highlighted as the human approval gate.</desc>
|
|
<defs>
|
|
<pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse"><circle cx="1" cy="1" r="0.9" fill="rgba(245,245,245,0.10)"/></pattern>
|
|
<marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#bfc0c0"/></marker>
|
|
<marker id="arrow-accent" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#f08a59"/></marker>
|
|
<marker id="arrow-link" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#6a95d8"/></marker>
|
|
<marker id="arrow-soft" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#8e98ac"/></marker>
|
|
</defs>
|
|
<rect width="1040" height="680" fill="#2d3142"/>
|
|
<rect width="1040" height="680" fill="url(#dots)" opacity="0.55"/>
|
|
|
|
<!-- Solid clockwise ring: six arcs on the same r=240 station circle. -->
|
|
<path class="ring" d="M600 113.726 A240 240 0 0 1 704.969 187.073" marker-end="url(#arrow)"/>
|
|
<path class="ring" d="M743.285 252 A240 240 0 0 1 743.722 426.882" marker-end="url(#arrow)"/>
|
|
<path class="ring" d="M705.731 492 A240 240 0 0 1 601.130 565.871" marker-end="url(#arrow)"/>
|
|
<path class="ring" d="M440 566.274 A240 240 0 0 1 335.031 492.927" marker-end="url(#arrow)"/>
|
|
<path class="ring" d="M296.715 428 A240 240 0 0 1 296.278 253.118" marker-end="url(#arrow)"/>
|
|
<path class="ring" d="M334.269 188 A240 240 0 0 1 438.870 114.129" marker-end="url(#arrow)"/>
|
|
|
|
<!-- Dashed write-backs: station inner edge to 6px before the hub stroke. -->
|
|
<path class="spoke" d="M520 132 V280" marker-end="url(#arrow-soft)"/>
|
|
<path class="spoke" d="M672 252 L616 284" marker-end="url(#arrow-soft)"/>
|
|
<path class="spoke" d="M672 428 L616 396" marker-end="url(#arrow-soft)"/>
|
|
<path class="spoke" d="M520 548 V400" marker-end="url(#arrow-soft)"/>
|
|
<path class="spoke" d="M368 428 L424 396" marker-end="url(#arrow-soft)"/>
|
|
<path class="spoke" d="M368 252 L424 284" marker-end="url(#arrow-soft)"/>
|
|
|
|
<!-- Curated spoke labels sit beside the line with an 8px visible gap. -->
|
|
<rect x="532" y="200" width="48" height="16" rx="4" fill="#2d3142"/>
|
|
<text x="556" y="212" class="arrow-label">SIGNALS</text>
|
|
<rect x="460" y="464" width="52" height="16" rx="4" fill="#2d3142"/>
|
|
<text x="486" y="476" class="arrow-label">OUTCOMES</text>
|
|
|
|
<!-- Stations -->
|
|
<rect class="station" x="440" y="68" width="160" height="64" rx="6"/>
|
|
<text x="520" y="96" class="node-name">Capture</text><text x="520" y="116" class="sublabel">signals in / intake</text>
|
|
|
|
<rect class="station" x="648" y="188" width="160" height="64" rx="6"/>
|
|
<text x="728" y="216" class="node-name">Research</text><text x="728" y="236" class="sublabel">evidence pulled</text>
|
|
|
|
<rect class="station focal" x="648" y="428" width="160" height="64" rx="6"/>
|
|
<text x="728" y="456" class="node-name focal-name">Decide</text><text x="728" y="476" class="sublabel">human approves</text>
|
|
|
|
<rect class="station" x="440" y="548" width="160" height="64" rx="6"/>
|
|
<text x="520" y="576" class="node-name">Act</text><text x="520" y="596" class="sublabel">work ships</text>
|
|
|
|
<rect class="station" x="232" y="428" width="160" height="64" rx="6"/>
|
|
<text x="312" y="456" class="node-name">Measure</text><text x="312" y="476" class="sublabel">outcomes logged</text>
|
|
|
|
<rect class="station" x="232" y="188" width="160" height="64" rx="6"/>
|
|
<text x="312" y="216" class="node-name">Learn</text><text x="312" y="236" class="sublabel">playbook updated</text>
|
|
|
|
<!-- The one shared-state hub. -->
|
|
<rect class="hub" x="420" y="288" width="200" height="104" rx="8"/>
|
|
<text x="520" y="336" class="hub-name">Shared memory</text>
|
|
<text x="520" y="360" class="hub-sub">one record, every loop</text>
|
|
</svg>
|
|
</main>
|
|
</body>
|
|
</html>
|