@haaaiawd/loom 1.3.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -86
- package/CONTRIBUTING.md +37 -0
- package/EVIL_EVAL.md +112 -0
- package/README.md +156 -403
- package/README.zh-CN.md +176 -0
- package/SECURITY.md +11 -0
- package/cli/bin/loom.js +171 -998
- package/cli/src/protocol.js +411 -0
- package/cli/src/store.js +628 -0
- package/design.md +201 -0
- package/docs/PROMPT_CATALOG.md +106 -0
- package/docs/RELEASE_CHECKLIST.md +53 -0
- package/docs/UX_FLOW.md +171 -0
- package/docs/brand/loom-mark.svg +18 -0
- package/docs/brand/loom-readme-header.svg +34 -0
- package/docs/brand/loom-readme-header.zh-CN.svg +29 -0
- package/docs/loom-eval-loop.drawio +21 -0
- package/docs/loom-eval-loop.svg +56 -0
- package/docs/loom-production-loop.drawio +41 -0
- package/docs/loom-production-loop.svg +92 -0
- package/package.json +27 -24
- package/EXTERNAL_ACQUISITION_DESIGN.md +0 -143
- package/cli/help/asset.md +0 -36
- package/cli/help/atelier.md +0 -37
- package/cli/help/atlas.md +0 -48
- package/cli/help/capability.md +0 -118
- package/cli/help/concepts.md +0 -105
- package/cli/help/doctor.md +0 -80
- package/cli/help/expertise.md +0 -52
- package/cli/help/loop.md +0 -134
- package/cli/help/patch.md +0 -33
- package/cli/help/proposals.md +0 -21
- package/cli/help/version.md +0 -136
- package/cli/help/workflow.md +0 -116
- package/cli/src/activate.js +0 -505
- package/cli/src/asset-library.js +0 -384
- package/cli/src/atelier.js +0 -331
- package/cli/src/atlas.js +0 -282
- package/cli/src/auto.js +0 -116
- package/cli/src/capability-graph.js +0 -724
- package/cli/src/capability-proposals.js +0 -225
- package/cli/src/diagnostics.js +0 -859
- package/cli/src/expertise-pack.js +0 -336
- package/cli/src/guide.js +0 -548
- package/cli/src/help.js +0 -41
- package/cli/src/init.js +0 -187
- package/cli/src/intent-draft.js +0 -303
- package/cli/src/intent-map.js +0 -747
- package/cli/src/patch.js +0 -214
- package/cli/src/philosophy.js +0 -331
- package/cli/src/shared/intent-ref.js +0 -38
- package/cli/src/shared/md-utils.js +0 -125
- package/cli/src/shared/paths.js +0 -73
- package/cli/src/shared/proof-reference.js +0 -19
- package/cli/src/shared/verification-method.js +0 -32
- package/cli/src/verify.js +0 -394
- package/cli/src/version.js +0 -134
- package/dimensions/AUTHORSHIP.md +0 -45
- package/dimensions/PART_DECOMPOSITION.md +0 -42
- package/dimensions/SEARCH_METHODOLOGY.md +0 -101
- package/dimensions/examples/AGENT_SYSTEM/README.md +0 -219
- package/dimensions/examples/CLI_TOOL/README.md +0 -163
- package/dimensions/universal/COLLABORATION_PHILOSOPHY.md +0 -28
- package/dimensions/universal/ENGINEERING_CREED.md +0 -30
- package/dimensions/universal/PRODUCT_PHILOSOPHY.md +0 -32
- package/meta/BASELINE.md +0 -91
- package/meta/INTENT_LOOP.md +0 -296
- package/meta/PHILOSOPHY_WEAVER.md +0 -110
- package/meta/ROLE_ACTIVATION.md +0 -114
- package/roles/architect.md +0 -92
- package/roles/forge.md +0 -110
- package/roles/impact-reviewer.md +0 -37
- package/roles/keeper.md +0 -113
- package/roles/visionary.md +0 -57
- package/templates/ASSET_LIBRARY_MANIFEST_TEMPLATE.json +0 -10
- package/templates/ATELIER_RECORD_TEMPLATE.json +0 -48
- package/templates/ATLAS_TEMPLATE.html +0 -104
- package/templates/CAPABILITY_BRIEF_TEMPLATE.md +0 -36
- package/templates/CAPABILITY_GRAPH_EXAMPLE.json +0 -188
- package/templates/CAPABILITY_GRAPH_TEMPLATE.json +0 -78
- package/templates/EXPERTISE_PACK_TEMPLATE.json +0 -22
- package/templates/INTENT_MAP_TEMPLATE.json +0 -85
- package/templates/PHILOSOPHY_TEMPLATE.md +0 -44
- package/templates/VISION_TEMPLATE.md +0 -44
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_meta": {
|
|
3
|
-
"_description": "quality_strategy=atelier 时由 Forge 为单个 Intent 创建的创作记录模板。",
|
|
4
|
-
"_version": "1.0",
|
|
5
|
-
"_loom_version": "v1",
|
|
6
|
-
"_generated_by": "forge"
|
|
7
|
-
},
|
|
8
|
-
"intent_id": "INT-001",
|
|
9
|
-
"intent_revision": 1,
|
|
10
|
-
"status": "draft",
|
|
11
|
-
"stance_revision": 1,
|
|
12
|
-
"stance": {
|
|
13
|
-
"creative_thesis": "",
|
|
14
|
-
"gaze": [],
|
|
15
|
-
"tension": "",
|
|
16
|
-
"signature_bet": {
|
|
17
|
-
"claim": "",
|
|
18
|
-
"mechanism": "",
|
|
19
|
-
"cost": ""
|
|
20
|
-
},
|
|
21
|
-
"refusals": [],
|
|
22
|
-
"reference_mechanisms": [],
|
|
23
|
-
"medium_grammar": {},
|
|
24
|
-
"surprise_budget": {
|
|
25
|
-
"level": "low|medium|high",
|
|
26
|
-
"allowed": "",
|
|
27
|
-
"protected": ""
|
|
28
|
-
},
|
|
29
|
-
"anti_fixation": [],
|
|
30
|
-
"verification_lens": []
|
|
31
|
-
},
|
|
32
|
-
"baseline": {
|
|
33
|
-
"artifact_refs": [],
|
|
34
|
-
"observed_limit": ""
|
|
35
|
-
},
|
|
36
|
-
"diversity_axes": [],
|
|
37
|
-
"candidates": [],
|
|
38
|
-
"corrections": [],
|
|
39
|
-
"blocker": null,
|
|
40
|
-
"selection": {
|
|
41
|
-
"status": "pending",
|
|
42
|
-
"selected_candidate": null,
|
|
43
|
-
"method": "",
|
|
44
|
-
"evidence_refs": [],
|
|
45
|
-
"why": "",
|
|
46
|
-
"remaining_tradeoff": ""
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<meta name="loom-atlas-source-digest" content="{{SOURCE_DIGEST}}">
|
|
7
|
-
<title>LOOM 决策图谱</title>
|
|
8
|
-
<style>
|
|
9
|
-
:root { --ink:#f2ecdf; --panel:#fbf7ef; --panel-2:#e9dfce; --paper:#24201c; --muted:#746b60; --line:rgba(48,38,28,.22); --acid:#a42a2a; --danger:#b95b3f; }
|
|
10
|
-
* { box-sizing:border-box; } html { background:var(--ink); } body { height:100dvh; min-height:100dvh; margin:0; overflow:hidden; background:var(--ink); color:var(--paper); font:500 16px/1.45 ui-sans-serif,system-ui,"Microsoft YaHei",sans-serif; }
|
|
11
|
-
button { font:inherit; } button:focus-visible { outline:2px solid var(--acid); outline-offset:3px; }
|
|
12
|
-
.atlas-shell { height:100dvh; min-height:100dvh; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
|
|
13
|
-
.atlas-topbar { position:relative; z-index:2; display:flex; justify-content:space-between; gap:1rem; padding:1.05rem clamp(1rem,3vw,3.5rem); border-top:5px solid var(--acid); border-bottom:1px solid var(--line); }
|
|
14
|
-
.atlas-title { margin:0; color:var(--paper); font-family:Georgia,"Songti SC",STSong,serif; font-size:1rem; font-weight:700; letter-spacing:.05em; } .atlas-title span { color:var(--acid); }
|
|
15
|
-
.atlas-views { display:flex; gap:.4rem; } .atlas-views button, .atlas-control, .atlas-chapter-nav button { appearance:none; border:0; background:transparent; color:var(--muted); cursor:pointer; }
|
|
16
|
-
.atlas-views button { padding:.35rem .55rem; border-bottom:1px solid transparent; } .atlas-views button[aria-pressed="true"] { color:var(--paper); border-color:var(--acid); }
|
|
17
|
-
.atlas-stage { position:relative; min-width:0; min-height:0; overflow:hidden; } .atlas-track { width:500%; height:100%; min-height:0; display:flex; transform:translate3d(0,0,0); transition:transform .68s cubic-bezier(.2,.75,.2,1); }
|
|
18
|
-
.atlas-slide { width:20%; min-height:calc(100dvh - 132px); display:grid; grid-template-columns:minmax(0,1.1fr) minmax(280px,.9fr); align-items:start; gap:clamp(2rem,6vw,7rem); padding:clamp(2.25rem,5vw,5.25rem) clamp(2rem,7vw,7rem); overflow:auto; }
|
|
19
|
-
.atlas-copy { max-width:42rem; } .atlas-copy p { max-width:38rem; color:var(--muted); } .atlas-kicker { margin:0 0 1.25rem; color:var(--acid) !important; font-size:.78rem; letter-spacing:.08em; text-transform:uppercase; }
|
|
20
|
-
h1, h2 { max-width:13ch; margin:0; font-family:Georgia,"Songti SC",STSong,serif; font-size:clamp(2.8rem,4.3vw,4.5rem); line-height:1; letter-spacing:-.045em; } h2 { font-size:clamp(2.35rem,3.7vw,3.8rem); }
|
|
21
|
-
.atlas-ledger { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:0; margin:1.75rem 0 0; border-top:2px solid var(--paper); border-bottom:1px solid var(--line); } .atlas-ledger div { min-height:5.2rem; padding:1rem .8rem 1rem 0; border-right:1px solid var(--line); } .atlas-ledger div + div { padding-left:.8rem; } .atlas-ledger div:last-child { border-right:0; } .atlas-ledger dt { color:var(--acid); font-size:.72rem; font-weight:700; letter-spacing:.06em; } .atlas-ledger dd { margin:.5rem 0 0; color:var(--paper); font-size:.88rem; line-height:1.35; }
|
|
22
|
-
.atlas-visual { position:relative; min-height:min(55vw,34rem); display:grid; align-content:center; gap:.8rem; } .atlas-visual svg { width:min(100%,36rem); height:auto; overflow:visible; }
|
|
23
|
-
.atlas-visual text { fill:var(--paper); font:500 13px ui-sans-serif,system-ui,sans-serif; } .atlas-visual .muted { fill:var(--muted); } .atlas-visual .accent { fill:var(--acid); } .atlas-visual .line { stroke:var(--line); } .atlas-visual .active-line { stroke:var(--acid); } .atlas-visual path.line, .atlas-visual path.active-line { fill:none; }
|
|
24
|
-
.atlas-note { margin-top:1.1rem; color:var(--muted); font-size:.85rem; } .atlas-note code { color:var(--paper); } .atlas-diagram-note { max-width:36rem; color:var(--muted); font-size:.82rem; } .atlas-diagram-note b { color:var(--paper); font-weight:500; }
|
|
25
|
-
.atlas-controls { position:relative; z-index:2; display:grid; grid-template-columns:1fr auto 1fr; align-items:center; gap:.8rem; padding:1rem clamp(1rem,3vw,3.5rem); border-top:1px solid var(--line); }
|
|
26
|
-
.atlas-control { display:inline-flex; align-items:center; gap:.65rem; width:max-content; padding:.4rem 0; color:var(--paper); } .atlas-control:last-child { justify-self:end; } .atlas-control b { color:var(--acid); font-size:1.25rem; font-weight:400; }
|
|
27
|
-
#atlas-position { color:var(--muted); font-variant-numeric:tabular-nums; font-size:.78rem; letter-spacing:.08em; }
|
|
28
|
-
.atlas-chapter-nav { position:absolute; z-index:3; inset:auto 0 4.7rem; display:flex; justify-content:center; gap:.45rem; pointer-events:none; } .atlas-chapter-nav button { width:.55rem; height:.55rem; padding:0; border:1px solid var(--muted); border-radius:50%; pointer-events:auto; }
|
|
29
|
-
.atlas-chapter-nav button[aria-current="true"] { border-color:var(--acid); background:var(--acid); }
|
|
30
|
-
.atlas-map-stage { display:none; align-content:center; gap:clamp(1.5rem,4vw,4rem); padding:clamp(1.5rem,5vw,5rem); overflow:auto; }
|
|
31
|
-
.atlas-map-heading { display:flex; justify-content:space-between; align-items:end; gap:2rem; } .atlas-map-heading h2 { max-width:14ch; } .atlas-map-heading p { max-width:34rem; margin:0; color:var(--muted); }
|
|
32
|
-
#atlas-audit-map { display:grid; grid-template-columns:minmax(0,1.65fr) minmax(15rem,.7fr); gap:1rem; align-items:stretch; } .atlas-map-canvas { min-height:22rem; border:1px solid var(--line); background:var(--panel); } .atlas-map-canvas svg { display:block; width:100%; height:100%; min-height:22rem; }
|
|
33
|
-
.atlas-map-canvas .edge { fill:none; stroke:var(--muted); stroke-width:1.25; } .atlas-map-canvas .node { fill:var(--panel-2); stroke:var(--muted); stroke-width:1.2; cursor:pointer; } .atlas-map-canvas .node:hover, .atlas-map-canvas .node:focus { stroke:var(--acid); } .atlas-map-canvas .node.active { fill:var(--acid); } .atlas-map-canvas .node-text { fill:var(--paper); font-size:12px; pointer-events:none; } .atlas-map-canvas .node.active + text { fill:var(--ink); }
|
|
34
|
-
.atlas-inspector { display:flex; flex-direction:column; justify-content:space-between; gap:2rem; padding:1.35rem; border:1px solid var(--line); background:var(--panel-2); } .atlas-inspector h3 { margin:0; font-family:Georgia,"Songti SC",STSong,serif; font-size:1.35rem; } .atlas-inspector p { color:var(--muted); } .atlas-source { margin:0; color:var(--acid) !important; font:12px/1.45 ui-monospace,SFMono-Regular,monospace; overflow-wrap:anywhere; }
|
|
35
|
-
[data-atlas-mode="map"] { overflow:auto; } [data-atlas-mode="map"] .atlas-stage, [data-atlas-mode="map"] .atlas-controls, [data-atlas-mode="map"] .atlas-chapter-nav { display:none; } [data-atlas-mode="map"] .atlas-map-stage { display:grid; }
|
|
36
|
-
@media (max-width:760px) { .atlas-slide { min-height:0; height:100%; grid-template-columns:1fr; grid-template-rows:auto minmax(16rem,1fr); align-content:start; gap:1.2rem; padding:2rem 1.25rem 3rem; overflow-y:auto; } .atlas-visual { min-height:15rem; } .atlas-copy p { font-size:.94rem; } .atlas-ledger { grid-template-columns:repeat(3,minmax(0,1fr)); } .atlas-ledger dd { font-size:.76rem; } .atlas-ledger dt { font-size:.65rem; } .atlas-visual text { font-size:16px; } .atlas-map-canvas .node-text { font-size:22px; } h1, h2 { max-width:12ch; } .atlas-topbar { padding:1rem 1.25rem; } .atlas-title { align-self:center; } .atlas-views button { font-size:.82rem; } .atlas-controls { padding:.85rem 1.25rem; } #atlas-audit-map { grid-template-columns:1fr; } .atlas-map-heading { display:block; } .atlas-map-heading p { margin-top:1rem; } }
|
|
37
|
-
@media (prefers-reduced-motion:reduce) { .atlas-track { transition:none; } }
|
|
38
|
-
</style>
|
|
39
|
-
</head>
|
|
40
|
-
<body data-atlas-experience="deck-map-v1" data-atlas-mode="deck">
|
|
41
|
-
<div class="atlas-shell">
|
|
42
|
-
<header class="atlas-topbar">
|
|
43
|
-
<p class="atlas-title">LOOM <span>Decision Atlas</span></p>
|
|
44
|
-
<div class="atlas-views" aria-label="阅读方式">
|
|
45
|
-
<button type="button" data-atlas-view="deck" aria-pressed="true">放映</button>
|
|
46
|
-
<button type="button" data-atlas-view="map" aria-pressed="false">审查地图</button>
|
|
47
|
-
</div>
|
|
48
|
-
</header>
|
|
49
|
-
|
|
50
|
-
<main class="atlas-stage" aria-label="Atlas 放映">
|
|
51
|
-
<div class="atlas-track" id="atlas-track">
|
|
52
|
-
<section class="atlas-slide" id="atlas-origin" data-atlas-slide aria-label="起点">
|
|
53
|
-
<div class="atlas-copy" data-atlas-example>
|
|
54
|
-
<p class="atlas-kicker">从一个承诺开始</p><h1>为什么要这样做?</h1>
|
|
55
|
-
<p>在这里把原则、北极星与非目标收成一个可被质疑的起点。不要逐段复述文档,让每条取舍都看得见。</p>
|
|
56
|
-
<dl class="atlas-ledger"><div><dt>要守住</dt><dd>北极星承诺</dd></div><div><dt>明确不做</dt><dd>非目标边界</dd></div><div><dt>可被挑战</dt><dd>取舍理由</dd></div></dl>
|
|
57
|
-
<p class="atlas-note">来源 <code>00_PHILOSOPHY/*</code></p>
|
|
58
|
-
</div>
|
|
59
|
-
<div class="atlas-visual" data-atlas-example><svg viewBox="0 0 520 400" role="img" aria-labelledby="origin-title origin-desc"><title id="origin-title">原则与非目标的取舍构图</title><desc id="origin-desc">中心北极星被原则支撑,非目标位于边缘以示明确排除。</desc><circle cx="260" cy="200" r="145" fill="none" class="line"/><circle cx="260" cy="200" r="76" fill="none" class="active-line"/><path d="M260 50V350M110 200H410" class="line"/><circle cx="260" cy="200" r="24" fill="var(--acid)"/><text x="260" y="206" text-anchor="middle" fill="var(--ink)">北极星</text><text x="260" y="28" text-anchor="middle" class="accent">原则</text><text x="438" y="204" class="muted">非目标</text><text x="260" y="372" text-anchor="middle" class="muted">可质疑的取舍</text></svg><p class="atlas-diagram-note"><b>读图:</b>中心不是结论,外围才是判断成立的边界。</p></div>
|
|
60
|
-
</section>
|
|
61
|
-
<section class="atlas-slide" id="atlas-structure" data-atlas-slide aria-label="结构">
|
|
62
|
-
<div class="atlas-copy" data-atlas-example><p class="atlas-kicker">把承诺落成结构</p><h2>系统如何不背叛它?</h2><p>用架构边界与 Intent 依赖代替长文说明。每层只回答一件事:它保护了什么,它依赖什么。</p><dl class="atlas-ledger"><div><dt>上层</dt><dd>用户可感知边界</dd></div><div><dt>中层</dt><dd>系统与数据约束</dd></div><div><dt>下层</dt><dd>可验证交付</dd></div></dl><p class="atlas-note">来源 <code>01_VISION.md · 02_ARCHITECTURE.md · 04_INTENT_MAP.json</code></p></div>
|
|
63
|
-
<div class="atlas-visual" data-atlas-example><svg viewBox="0 0 520 400" role="img" aria-labelledby="structure-title structure-desc"><title id="structure-title">架构层与 Intent 依赖</title><desc id="structure-desc">三层架构通过一条意图依赖线连接。</desc><rect x="88" y="72" width="344" height="64" rx="2" fill="var(--panel-2)" class="line"/><rect x="118" y="166" width="284" height="64" rx="2" fill="var(--panel)" class="line"/><rect x="148" y="260" width="224" height="64" rx="2" fill="var(--panel-2)" class="active-line"/><text x="112" y="111">体验与接口边界</text><text x="142" y="205">系统与数据边界</text><text x="172" y="299">可验证的交付</text><path d="M260 136V166M260 230V260" class="active-line"/><circle cx="260" cy="150" r="6" fill="var(--acid)"/><circle cx="260" cy="245" r="6" fill="var(--acid)"/><text x="445" y="151" class="accent">Intent</text></svg><p class="atlas-diagram-note"><b>读图:</b>亮线代表从体验承诺到可验证交付的追溯路径。</p></div>
|
|
64
|
-
</section>
|
|
65
|
-
<section class="atlas-slide" id="atlas-capabilities" data-atlas-slide aria-label="能力">
|
|
66
|
-
<div class="atlas-copy" data-atlas-example><p class="atlas-kicker">能力不是装饰</p><h2>为结果配置真实专长。</h2><p>把 Outcome、Concern、Capability、专业领域与证据连成一张图。点击一个节点时,应能看到它具体服务哪条承诺。</p><dl class="atlas-ledger"><div><dt>结果</dt><dd>用户最终获得什么</dd></div><div><dt>能力</dt><dd>需要解决什么问题</dd></div><div><dt>证据</dt><dd>如何确认它成立</dd></div></dl><p class="atlas-note">来源 <code>07_CAPABILITY_GRAPH.json · 07_CAPABILITY_BRIEFS/*</code></p></div>
|
|
67
|
-
<div class="atlas-visual" data-atlas-example><svg viewBox="0 0 520 400" role="img" aria-labelledby="capability-title capability-desc"><title id="capability-title">能力链关系图</title><desc id="capability-desc">结果、关注点、能力和专业领域形成一条可追溯能力链。</desc><path d="M86 200H202M316 200H434M260 94V306" class="active-line"/><circle cx="72" cy="200" r="48" fill="var(--panel-2)" class="line"/><circle cx="260" cy="94" r="38" fill="var(--panel)" class="line"/><circle cx="260" cy="200" r="58" fill="var(--acid)"/><circle cx="260" cy="306" r="38" fill="var(--panel)" class="line"/><circle cx="448" cy="200" r="48" fill="var(--panel-2)" class="line"/><text x="72" y="205" text-anchor="middle">结果</text><text x="260" y="99" text-anchor="middle" class="muted">关注点</text><text x="260" y="205" text-anchor="middle" fill="var(--ink)">能力</text><text x="260" y="311" text-anchor="middle" class="muted">领域</text><text x="448" y="205" text-anchor="middle">证据</text></svg><p class="atlas-diagram-note"><b>读图:</b>不是所有专业名词都值得上图,只有能连回结果的能力才留下。</p></div>
|
|
68
|
-
</section>
|
|
69
|
-
<section class="atlas-slide" id="atlas-decisions" data-atlas-slide aria-label="决策">
|
|
70
|
-
<div class="atlas-copy" data-atlas-example><p class="atlas-kicker">不是唯一正确</p><h2>每个选择都保留代价。</h2><p>把 ADR 处理成分叉,而不是胜利清单。读者应该能一眼看到选择什么、没有选择什么,以及依据来自哪里。</p><dl class="atlas-ledger"><div><dt>问题</dt><dd>必须作出的取舍</dd></div><div><dt>选择</dt><dd>被采纳的方向</dd></div><div><dt>代价</dt><dd>仍需承担的后果</dd></div></dl><p class="atlas-note">来源 <code>03_DECISIONS/*</code></p></div>
|
|
71
|
-
<div class="atlas-visual" data-atlas-example><svg viewBox="0 0 520 400" role="img" aria-labelledby="decision-title decision-desc"><title id="decision-title">决策分叉与取舍</title><desc id="decision-desc">一个问题分出两种方案,选定路径以亮色表达,另一条保留其代价。</desc><path d="M72 200H214M214 200L420 92M214 200L420 308" class="line"/><path d="M72 200H214L420 92" class="active-line" stroke-width="3"/><circle cx="72" cy="200" r="34" fill="var(--panel-2)" class="line"/><circle cx="214" cy="200" r="26" fill="var(--acid)"/><circle cx="420" cy="92" r="42" fill="var(--panel-2)" class="active-line"/><circle cx="420" cy="308" r="42" fill="var(--panel)" class="line"/><text x="72" y="205" text-anchor="middle">问题</text><text x="214" y="205" text-anchor="middle" fill="var(--ink)">取舍</text><text x="420" y="97" text-anchor="middle">选择</text><text x="420" y="313" text-anchor="middle" class="muted">舍弃</text></svg><p class="atlas-diagram-note"><b>读图:</b>暗线不是被隐藏的失败,它是这条选择真实的成本。</p></div>
|
|
72
|
-
</section>
|
|
73
|
-
<section class="atlas-slide" id="atlas-review" data-atlas-slide aria-label="审查">
|
|
74
|
-
<div class="atlas-copy" data-atlas-example><p class="atlas-kicker">把缺口留在光下</p><h2>哪里仍然不够好?</h2><p>这里不宣告完成。它只留下结构上的断线、待确认项和能返回原始资料的入口,供下一次判断使用。</p><dl class="atlas-ledger"><div><dt>断线</dt><dd>需要补回的关系</dd></div><div><dt>待确认</dt><dd>尚无依据的判断</dd></div><div><dt>回到资料</dt><dd>每项都有来源</dd></div></dl><p class="atlas-note">来源 <code>Atlas structural_review · source_refs</code></p></div>
|
|
75
|
-
<div class="atlas-visual" data-atlas-example><svg viewBox="0 0 520 400" role="img" aria-labelledby="review-title review-desc"><title id="review-title">结构性缺口审查</title><desc id="review-desc">完整链路和断开的链路并置,提醒审查者回到来源资料。</desc><path d="M72 200H168M224 200H304M360 200H448" class="active-line"/><path d="M168 200H224M304 200H360" stroke="var(--danger)" stroke-width="2" stroke-dasharray="7 8"/><circle cx="72" cy="200" r="28" fill="var(--panel-2)" class="line"/><circle cx="196" cy="200" r="28" fill="var(--panel-2)" stroke="var(--danger)" stroke-width="2"/><circle cx="332" cy="200" r="28" fill="var(--panel-2)" stroke="var(--danger)" stroke-width="2"/><circle cx="448" cy="200" r="28" fill="var(--panel-2)" class="line"/><text x="72" y="205" text-anchor="middle">目标</text><text x="196" y="205" text-anchor="middle">?</text><text x="332" y="205" text-anchor="middle">?</text><text x="448" y="205" text-anchor="middle">证据</text></svg><p class="atlas-diagram-note"><b>读图:</b>断线是待查路径,不是完成率,也不替人下结论。</p></div>
|
|
76
|
-
</section>
|
|
77
|
-
</div>
|
|
78
|
-
</main>
|
|
79
|
-
|
|
80
|
-
<section class="atlas-map-stage" aria-label="Atlas 审查地图">
|
|
81
|
-
<div class="atlas-map-heading"><div><p class="atlas-kicker">从关系开始审查</p><h2>一条链,还是一团雾?</h2></div><p>这里应从 Atlas Model 生成可点击节点。选择节点后,检查台只展示必要解释、连接对象和来源,不重复整篇文档。</p></div>
|
|
82
|
-
<div id="atlas-audit-map">
|
|
83
|
-
<div class="atlas-map-canvas" data-atlas-example><svg viewBox="0 0 760 430" role="img" aria-labelledby="map-title map-desc"><title id="map-title">目标到验证设计的审查链</title><desc id="map-desc">从目标、能力、专业领域、Intent 到验证设计的一条可点击关系链。</desc><path class="edge" d="M126 215H258M350 215H454M546 215H652"/><g data-atlas-node="目标" role="button" tabindex="0"><rect class="node active" x="30" y="170" width="96" height="90" rx="2"/><text class="node-text" x="78" y="220" text-anchor="middle">目标</text></g><g data-atlas-node="能力" role="button" tabindex="0"><rect class="node" x="258" y="170" width="92" height="90" rx="2"/><text class="node-text" x="304" y="220" text-anchor="middle">能力</text></g><g data-atlas-node="领域" role="button" tabindex="0"><rect class="node" x="454" y="170" width="92" height="90" rx="2"/><text class="node-text" x="500" y="220" text-anchor="middle">领域</text></g><g data-atlas-node="Intent" role="button" tabindex="0"><rect class="node" x="652" y="170" width="78" height="90" rx="2"/><text class="node-text" x="691" y="220" text-anchor="middle">Intent</text></g><path class="edge" d="M691 260V350H304V260"/><text class="node-text" x="496" y="380" text-anchor="middle">验证设计</text></svg></div>
|
|
84
|
-
<aside class="atlas-inspector" aria-live="polite"><div><p class="atlas-kicker">检查台</p><h3 id="atlas-inspector-title">目标</h3><p id="atlas-inspector-copy">选择一个节点,查看它在当前决策结构中的作用与连接。</p></div><p class="atlas-source" id="atlas-inspector-source">source_refs: Atlas Model</p></aside>
|
|
85
|
-
</div>
|
|
86
|
-
</section>
|
|
87
|
-
|
|
88
|
-
<nav class="atlas-chapter-nav" aria-label="章节定位"><button type="button" data-atlas-jump="0" aria-current="true" aria-label="起点"></button><button type="button" data-atlas-jump="1" aria-current="false" aria-label="结构"></button><button type="button" data-atlas-jump="2" aria-current="false" aria-label="能力"></button><button type="button" data-atlas-jump="3" aria-current="false" aria-label="决策"></button><button type="button" data-atlas-jump="4" aria-current="false" aria-label="审查"></button></nav>
|
|
89
|
-
<footer class="atlas-controls"><button type="button" class="atlas-control" data-atlas-control="previous"><b>←</b> 上一章</button><span id="atlas-position" aria-live="polite">起点 1 / 5</span><button type="button" class="atlas-control" data-atlas-control="next">下一章 <b>→</b></button></footer>
|
|
90
|
-
</div>
|
|
91
|
-
<script>
|
|
92
|
-
(() => {
|
|
93
|
-
const root = document.body; const track = document.getElementById('atlas-track'); const slides = [...document.querySelectorAll('[data-atlas-slide]')]; const jumps = [...document.querySelectorAll('[data-atlas-jump]')]; const position = document.getElementById('atlas-position'); const names = ['起点', '结构', '能力', '决策', '审查']; let current = 0; let touchStart = null;
|
|
94
|
-
const go = (index) => { current = Math.max(0, Math.min(slides.length - 1, index)); track.style.transform = `translate3d(${-current * 20}%,0,0)`; jumps.forEach((button, i) => button.setAttribute('aria-current', String(i === current))); position.textContent = `${names[current]} ${current + 1} / ${slides.length}`; };
|
|
95
|
-
document.querySelector('[data-atlas-control="previous"]').addEventListener('click', () => go(current - 1)); document.querySelector('[data-atlas-control="next"]').addEventListener('click', () => go(current + 1)); jumps.forEach((button) => button.addEventListener('click', () => go(Number(button.dataset.atlasJump))));
|
|
96
|
-
document.querySelectorAll('[data-atlas-view]').forEach((button) => button.addEventListener('click', () => { const mode = button.dataset.atlasView; root.dataset.atlasMode = mode; document.querySelectorAll('[data-atlas-view]').forEach((view) => view.setAttribute('aria-pressed', String(view === button))); }));
|
|
97
|
-
window.addEventListener('keydown', (event) => { if (root.dataset.atlasMode !== 'deck' || /INPUT|TEXTAREA|SELECT/.test(document.activeElement.tagName)) return; if (event.key === 'ArrowLeft') go(current - 1); if (event.key === 'ArrowRight') go(current + 1); });
|
|
98
|
-
track.addEventListener('touchstart', (event) => { touchStart = event.changedTouches[0].clientX; }, { passive:true }); track.addEventListener('touchend', (event) => { if (touchStart === null) return; const distance = event.changedTouches[0].clientX - touchStart; if (Math.abs(distance) > 44) go(current + (distance < 0 ? 1 : -1)); touchStart = null; }, { passive:true });
|
|
99
|
-
const nodeDetails = { 目标:['目标','它定义这张图最终要守住的用户结果。','source_refs: capability_graph.outcomes'], 能力:['能力','它是为结果解决具体问题的可观察专长。','source_refs: capability_graph.capabilities'], 领域:['领域','它标出需要引入的专业知识,而不是贴标签。','source_refs: capability_domains'], Intent:['Intent','它把能力落成可实现、可验证的产品承诺。','source_refs: intent_structure'] };
|
|
100
|
-
document.querySelectorAll('[data-atlas-node]').forEach((node) => { const inspect = () => { const [title, copy, source] = nodeDetails[node.dataset.atlasNode]; document.getElementById('atlas-inspector-title').textContent = title; document.getElementById('atlas-inspector-copy').textContent = copy; document.getElementById('atlas-inspector-source').textContent = source; document.querySelectorAll('[data-atlas-node] .node').forEach((shape) => shape.classList.remove('active')); node.querySelector('.node').classList.add('active'); }; node.addEventListener('click', inspect); node.addEventListener('keydown', (event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); inspect(); } }); });
|
|
101
|
-
})();
|
|
102
|
-
</script>
|
|
103
|
-
</body>
|
|
104
|
-
</html>
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# [节点 ID] — [能力名称]
|
|
2
|
-
|
|
3
|
-
<!-- LOOM_CAPABILITY_BRIEF -->
|
|
4
|
-
|
|
5
|
-
## 项目问题
|
|
6
|
-
|
|
7
|
-
- 连接的项目结果:
|
|
8
|
-
- 关联的系统 / 体验 / 风险:
|
|
9
|
-
- 缺失或误用此能力的后果:
|
|
10
|
-
|
|
11
|
-
## 成功判断
|
|
12
|
-
|
|
13
|
-
说明什么证据证明这项能力被正确应用,而不是只写“已参考最佳实践”。
|
|
14
|
-
|
|
15
|
-
## 项目约束
|
|
16
|
-
|
|
17
|
-
- 不得改变的接口、数据、资产、品牌或历史状态:
|
|
18
|
-
- 已知依赖与失败边界:
|
|
19
|
-
|
|
20
|
-
## 能力获取计划
|
|
21
|
-
|
|
22
|
-
- 需要回答的专业决策问题:
|
|
23
|
-
- 可用的检索通道、工具、项目事实或人类输入(不在 Brief 写死网站和关键词):
|
|
24
|
-
- Forge 应依据哪些项目信号派生本轮查询:
|
|
25
|
-
- 哪一种发现会改变当前设计、实现或验证决定:
|
|
26
|
-
- 不可用时的降级或回流:
|
|
27
|
-
|
|
28
|
-
## 产出与验证入口
|
|
29
|
-
|
|
30
|
-
- 计划形成的设计、实现、研究结论或可复现证据:
|
|
31
|
-
- Keeper 如何独立检查:
|
|
32
|
-
- 若结果要在外部宿主、用户界面、接收系统或交付物中被使用:实际观察目标、复现步骤、通过标准与证据产物路径:
|
|
33
|
-
|
|
34
|
-
## 非目标
|
|
35
|
-
|
|
36
|
-
本次不把这项能力扩张为:
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_meta": {
|
|
3
|
-
"_description": "示例:一张能力边界图不是按部门分类,也不是 Intent 的镜像。它先完成透镜审视,再用关系表达共享能力、约束、风险与证据。替换为自己的项目事实,不要复制节点标题。",
|
|
4
|
-
"_version": "1.2",
|
|
5
|
-
"_loom_version": "v1",
|
|
6
|
-
"_generated_by": "architect-example"
|
|
7
|
-
},
|
|
8
|
-
"lens_contract": {
|
|
9
|
-
"selection_basis": "这是一个帮助用户审视复杂选择的对话式产品;交互状态、视觉阅读、论断措辞、证据数据和信任风险都会直接影响结果。",
|
|
10
|
-
"lenses": [
|
|
11
|
-
{
|
|
12
|
-
"id": "journey",
|
|
13
|
-
"title": "用户旅程",
|
|
14
|
-
"question": "用户从开始到离开,是否能完成有意义的完整路径?",
|
|
15
|
-
"status": "applicable",
|
|
16
|
-
"node_refs": ["OUTCOME-REVISABLE-CHOICE", "CAP-STATEFUL-GUIDANCE"]
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"id": "interaction_accessibility",
|
|
20
|
-
"title": "交互与可访问性",
|
|
21
|
-
"question": "状态、反馈、失败恢复和不同使用条件是否真实可用?",
|
|
22
|
-
"status": "applicable",
|
|
23
|
-
"node_refs": ["CAP-STATEFUL-GUIDANCE", "EVIDENCE-END-TO-END-USE"]
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "visual_editorial",
|
|
27
|
-
"title": "视觉与信息表达",
|
|
28
|
-
"question": "视觉语言、层级、版式与资产是否帮助用户理解并形成该产品的气质?",
|
|
29
|
-
"status": "applicable",
|
|
30
|
-
"node_refs": ["CAP-EVIDENCE-READABILITY", "EVIDENCE-END-TO-END-USE"]
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"id": "content_communication",
|
|
34
|
-
"title": "内容与沟通",
|
|
35
|
-
"question": "文案、信息呈现或对话是否准确、可理解且符合产品立场?",
|
|
36
|
-
"status": "applicable",
|
|
37
|
-
"node_refs": ["CAP-CONDITIONAL-INSIGHT", "RISK-OVERCLAIM"]
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"id": "system_data",
|
|
41
|
-
"title": "系统与数据",
|
|
42
|
-
"question": "数据、模型、集成、权限与运行边界是否支撑而非伤害用户结果?",
|
|
43
|
-
"status": "applicable",
|
|
44
|
-
"node_refs": ["CONCERN-USER-OWNERSHIP", "CAP-STATEFUL-GUIDANCE"]
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"id": "quality_risk",
|
|
48
|
-
"title": "横切质量与风险",
|
|
49
|
-
"question": "可靠性、隐私、安全、性能、素材来源与独立验证是否被处理?",
|
|
50
|
-
"status": "applicable",
|
|
51
|
-
"node_refs": ["RISK-OVERCLAIM", "EVIDENCE-END-TO-END-USE"]
|
|
52
|
-
}
|
|
53
|
-
]
|
|
54
|
-
},
|
|
55
|
-
"capability_domains": [
|
|
56
|
-
{
|
|
57
|
-
"id": "DOMAIN-INTERACTION-DESIGN",
|
|
58
|
-
"title": "Interaction Design / UX",
|
|
59
|
-
"question": "怎样让状态、错误、恢复与退出在真实交互中可理解且可操作?",
|
|
60
|
-
"why_now": "入口和恢复并非视觉润色;它决定用户能否保有会话主导权。",
|
|
61
|
-
"node_refs": ["CAP-STATEFUL-GUIDANCE", "CAP-EVIDENCE-READABILITY"]
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"id": "DOMAIN-EDITORIAL-INFORMATION-DESIGN",
|
|
65
|
-
"title": "Editorial & Information Design",
|
|
66
|
-
"question": "怎样让事实、推断和待验证问题在有限屏幕内保持可分辨的阅读层级?",
|
|
67
|
-
"why_now": "报告若只显得有权威而不能被扫读,会直接放大过度断言风险。",
|
|
68
|
-
"node_refs": ["CAP-EVIDENCE-READABILITY", "CAP-CONDITIONAL-INSIGHT"]
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"id": "DOMAIN-APPLIED-EPISTEMICS",
|
|
72
|
-
"title": "Applied Epistemics / Responsible AI Communication",
|
|
73
|
-
"question": "怎样在给出有用洞察时保留条件、证据来源、反例与用户修正权?",
|
|
74
|
-
"why_now": "这里的措辞和推断结构会决定产品是在帮助用户判断,还是冒充裁决者。",
|
|
75
|
-
"node_refs": ["CAP-CONDITIONAL-INSIGHT"]
|
|
76
|
-
}
|
|
77
|
-
],
|
|
78
|
-
"nodes": {
|
|
79
|
-
"OUTCOME-REVISABLE-CHOICE": {
|
|
80
|
-
"id": "OUTCOME-REVISABLE-CHOICE",
|
|
81
|
-
"kind": "outcome",
|
|
82
|
-
"title": "用户带着可修订的选择假设离开,而不是被系统替他下结论",
|
|
83
|
-
"status": "covered",
|
|
84
|
-
"impact": "high",
|
|
85
|
-
"route": "intent",
|
|
86
|
-
"intent_refs": ["INT-002", "INT-003"],
|
|
87
|
-
"relationships": [
|
|
88
|
-
{ "type": "refines", "target": "CONCERN-USER-OWNERSHIP" },
|
|
89
|
-
{ "type": "requires", "target": "CAP-STATEFUL-GUIDANCE" },
|
|
90
|
-
{ "type": "requires", "target": "CAP-CONDITIONAL-INSIGHT" },
|
|
91
|
-
{ "type": "requires", "target": "CAP-EVIDENCE-READABILITY" },
|
|
92
|
-
{ "type": "risks", "target": "RISK-OVERCLAIM" },
|
|
93
|
-
{ "type": "validated_by", "target": "EVIDENCE-END-TO-END-USE" }
|
|
94
|
-
]
|
|
95
|
-
},
|
|
96
|
-
"CONCERN-USER-OWNERSHIP": {
|
|
97
|
-
"id": "CONCERN-USER-OWNERSHIP",
|
|
98
|
-
"kind": "concern",
|
|
99
|
-
"title": "用户始终理解系统现在知道什么、能暂停或修正什么",
|
|
100
|
-
"status": "covered",
|
|
101
|
-
"impact": "high",
|
|
102
|
-
"route": "intent",
|
|
103
|
-
"intent_refs": ["INT-001", "INT-002"],
|
|
104
|
-
"relationships": [
|
|
105
|
-
{ "type": "constrains", "target": "CAP-STATEFUL-GUIDANCE" },
|
|
106
|
-
{ "type": "constrains", "target": "CAP-CONDITIONAL-INSIGHT" }
|
|
107
|
-
]
|
|
108
|
-
},
|
|
109
|
-
"CAP-STATEFUL-GUIDANCE": {
|
|
110
|
-
"id": "CAP-STATEFUL-GUIDANCE",
|
|
111
|
-
"kind": "capability",
|
|
112
|
-
"title": "让会话状态、失败恢复与暂停入口保持可理解",
|
|
113
|
-
"status": "researched",
|
|
114
|
-
"impact": "high",
|
|
115
|
-
"route": "brief",
|
|
116
|
-
"intent_refs": ["INT-001", "INT-002"],
|
|
117
|
-
"domain_refs": ["DOMAIN-INTERACTION-DESIGN"],
|
|
118
|
-
"acquisition_mode": "external_required",
|
|
119
|
-
"brief_ref": "07_CAPABILITY_BRIEFS/CAP-STATEFUL-GUIDANCE.md",
|
|
120
|
-
"question": "用户是否能看见当前状态、理解下一步,并在中断后安全恢复或退出?",
|
|
121
|
-
"relationships": [
|
|
122
|
-
{ "type": "requires", "target": "CAP-EVIDENCE-READABILITY" },
|
|
123
|
-
{ "type": "risks", "target": "RISK-OVERCLAIM" }
|
|
124
|
-
]
|
|
125
|
-
},
|
|
126
|
-
"CAP-CONDITIONAL-INSIGHT": {
|
|
127
|
-
"id": "CAP-CONDITIONAL-INSIGHT",
|
|
128
|
-
"kind": "capability",
|
|
129
|
-
"title": "把洞察表达为带证据、条件与反例的可修订假设",
|
|
130
|
-
"status": "researched",
|
|
131
|
-
"impact": "high",
|
|
132
|
-
"route": "brief",
|
|
133
|
-
"intent_refs": ["INT-002", "INT-003"],
|
|
134
|
-
"domain_refs": ["DOMAIN-EDITORIAL-INFORMATION-DESIGN", "DOMAIN-APPLIED-EPISTEMICS"],
|
|
135
|
-
"acquisition_mode": "external_required",
|
|
136
|
-
"brief_ref": "07_CAPABILITY_BRIEFS/CAP-CONDITIONAL-INSIGHT.md",
|
|
137
|
-
"question": "系统能否给出具体洞察而不越权成为命运裁决者?",
|
|
138
|
-
"relationships": [
|
|
139
|
-
{ "type": "requires", "target": "CAP-EVIDENCE-READABILITY" },
|
|
140
|
-
{ "type": "risks", "target": "RISK-OVERCLAIM" }
|
|
141
|
-
]
|
|
142
|
-
},
|
|
143
|
-
"CAP-EVIDENCE-READABILITY": {
|
|
144
|
-
"id": "CAP-EVIDENCE-READABILITY",
|
|
145
|
-
"kind": "capability",
|
|
146
|
-
"title": "让证据、推断与待验证问题在报告中可扫读且不被视觉淹没",
|
|
147
|
-
"status": "researched",
|
|
148
|
-
"impact": "high",
|
|
149
|
-
"route": "brief",
|
|
150
|
-
"intent_refs": ["INT-002", "INT-003"],
|
|
151
|
-
"domain_refs": ["DOMAIN-INTERACTION-DESIGN", "DOMAIN-EDITORIAL-INFORMATION-DESIGN"],
|
|
152
|
-
"acquisition_mode": "external_required",
|
|
153
|
-
"brief_ref": "07_CAPABILITY_BRIEFS/CAP-EVIDENCE-READABILITY.md",
|
|
154
|
-
"question": "窄屏和长文本中,用户能否分清事实、推断和下一步,而不是只看到漂亮结论?",
|
|
155
|
-
"relationships": []
|
|
156
|
-
},
|
|
157
|
-
"RISK-OVERCLAIM": {
|
|
158
|
-
"id": "RISK-OVERCLAIM",
|
|
159
|
-
"kind": "risk",
|
|
160
|
-
"title": "流畅、权威的表达掩盖了证据不足,诱导用户把假设当成定论",
|
|
161
|
-
"status": "covered",
|
|
162
|
-
"impact": "high",
|
|
163
|
-
"route": "intent",
|
|
164
|
-
"intent_refs": ["INT-002", "INT-003"],
|
|
165
|
-
"relationships": [
|
|
166
|
-
{ "type": "validated_by", "target": "EVIDENCE-END-TO-END-USE" }
|
|
167
|
-
]
|
|
168
|
-
},
|
|
169
|
-
"EVIDENCE-END-TO-END-USE": {
|
|
170
|
-
"id": "EVIDENCE-END-TO-END-USE",
|
|
171
|
-
"kind": "evidence",
|
|
172
|
-
"title": "独立使用者在真实阅读与中断恢复路径中区分证据、推断与可操作的下一步",
|
|
173
|
-
"status": "covered",
|
|
174
|
-
"impact": "high",
|
|
175
|
-
"route": "intent",
|
|
176
|
-
"intent_refs": ["INT-003"],
|
|
177
|
-
"verification": {
|
|
178
|
-
"method": "independent_human_review",
|
|
179
|
-
"target": "窄屏和桌面端的真实报告与会话恢复界面",
|
|
180
|
-
"procedure": "让未参与实现者完成一次中断、恢复、阅读报告并追问一个结论来源的任务。",
|
|
181
|
-
"pass_criteria": "使用者能指出至少一项证据、一项条件化推断与一个修正入口;恢复过程没有丢失已确认状态。",
|
|
182
|
-
"artifact": "verifications/INT-003-end-to-end-use.md"
|
|
183
|
-
},
|
|
184
|
-
"relationships": []
|
|
185
|
-
}
|
|
186
|
-
},
|
|
187
|
-
"constraints": []
|
|
188
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_meta": {
|
|
3
|
-
"_description": "Capability Graph 起点:从项目初衷展开问题面、能力缺口、风险与证据,再编译为 Intent。先完成 lens_contract;再从项目事实派生 capability_domains,让具体 capability 回链其专业领域。每个 capability 先写 impact_assessment:影响的用户结果、错判代价、外部知识会不会改变决定与理由;错判不可逆或外部知识会改变决定即为 high,必须 external_required。Graph 不保存网站、Skill 或搜索词。",
|
|
4
|
-
"_version": "1.3",
|
|
5
|
-
"_loom_version": "v1",
|
|
6
|
-
"_generated_by": "architect",
|
|
7
|
-
"_template": true
|
|
8
|
-
},
|
|
9
|
-
"lens_contract": {
|
|
10
|
-
"selection_basis": "[从愿景、用户、媒介与实际交付方式判断;不要按固定部门表格机械分类。]",
|
|
11
|
-
"lenses": [
|
|
12
|
-
{
|
|
13
|
-
"id": "journey",
|
|
14
|
-
"title": "用户旅程",
|
|
15
|
-
"question": "用户从开始到离开,是否能完成有意义的完整路径?",
|
|
16
|
-
"status": "applicable",
|
|
17
|
-
"node_refs": []
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
"id": "interaction_accessibility",
|
|
21
|
-
"title": "交互与可访问性",
|
|
22
|
-
"question": "状态、反馈、失败恢复和不同使用条件是否真实可用?",
|
|
23
|
-
"status": "applicable",
|
|
24
|
-
"node_refs": []
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "visual_editorial",
|
|
28
|
-
"title": "视觉与信息表达",
|
|
29
|
-
"question": "视觉语言、层级、版式与资产是否帮助用户理解并形成该产品的气质?",
|
|
30
|
-
"status": "applicable",
|
|
31
|
-
"node_refs": []
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"id": "content_communication",
|
|
35
|
-
"title": "内容与沟通",
|
|
36
|
-
"question": "文案、信息呈现或对话是否准确、可理解且符合产品立场?",
|
|
37
|
-
"status": "applicable",
|
|
38
|
-
"node_refs": []
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"id": "system_data",
|
|
42
|
-
"title": "系统与数据",
|
|
43
|
-
"question": "数据、模型、集成、权限与运行边界是否支撑而非伤害用户结果?",
|
|
44
|
-
"status": "applicable",
|
|
45
|
-
"node_refs": []
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"id": "quality_risk",
|
|
49
|
-
"title": "横切质量与风险",
|
|
50
|
-
"question": "可靠性、隐私、安全、性能、素材来源与独立验证是否被处理?",
|
|
51
|
-
"status": "applicable",
|
|
52
|
-
"node_refs": []
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
},
|
|
56
|
-
"capability_domains": [
|
|
57
|
-
{
|
|
58
|
-
"id": "DOMAIN-EXAMPLE",
|
|
59
|
-
"title": "[会改变本项目方案或验证方式的专业领域,例如 Interaction Design / UX]",
|
|
60
|
-
"question": "[这个领域必须回答什么专业问题?]",
|
|
61
|
-
"why_now": "[为什么它会实质改变当前项目的设计、实现或验证?]",
|
|
62
|
-
"node_refs": []
|
|
63
|
-
}
|
|
64
|
-
],
|
|
65
|
-
"impact_review": {
|
|
66
|
-
"reviewer_mode": "independent_agent_thread",
|
|
67
|
-
"assessments": [
|
|
68
|
-
{
|
|
69
|
-
"capability_id": "[CAPABILITY-ID]",
|
|
70
|
-
"recommended_impact": "high",
|
|
71
|
-
"external_acquisition_required": true,
|
|
72
|
-
"rationale": "[由新的 Agent thread 判断:错判会伤害哪个用户结果?外部知识会如何改变方案或验收?]"
|
|
73
|
-
}
|
|
74
|
-
]
|
|
75
|
-
},
|
|
76
|
-
"nodes": {},
|
|
77
|
-
"constraints": []
|
|
78
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_meta": {
|
|
3
|
-
"_description": "当前 Intent 的外部能力获取记录。只保存检索计划、来源定位与项目化核心信息,不复制第三方 Skill 或网站内容。",
|
|
4
|
-
"_version": "1.0",
|
|
5
|
-
"_loom_version": "v1",
|
|
6
|
-
"_generated_by": "forge"
|
|
7
|
-
},
|
|
8
|
-
"intent_id": "INT-001",
|
|
9
|
-
"intent_revision": 1,
|
|
10
|
-
"required_capability_refs": [],
|
|
11
|
-
"status": "draft",
|
|
12
|
-
"search_plan": {
|
|
13
|
-
"decision_question": "",
|
|
14
|
-
"project_signals": [],
|
|
15
|
-
"derived_queries": [],
|
|
16
|
-
"constraints": [],
|
|
17
|
-
"stop_condition": ""
|
|
18
|
-
},
|
|
19
|
-
"sources": [],
|
|
20
|
-
"capsules": [],
|
|
21
|
-
"blocker": null
|
|
22
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_meta": {
|
|
3
|
-
"_description": "Intent Map 起点骨架。由 Architect 产出。这是 JSON 结构定义——Architect 填充实际内容,可增减字段,但必须保留标注 [必须] 的字段。",
|
|
4
|
-
"_version": "1.2",
|
|
5
|
-
"_loom_version": "v1",
|
|
6
|
-
"_parent_version": null,
|
|
7
|
-
"_generated_by": "architect",
|
|
8
|
-
"_generated_at": "ISO 8601 时间戳",
|
|
9
|
-
"_template": true
|
|
10
|
-
},
|
|
11
|
-
|
|
12
|
-
"intents": {
|
|
13
|
-
"INT-001": {
|
|
14
|
-
"id": "INT-001",
|
|
15
|
-
"revision": 1,
|
|
16
|
-
"title": "[必须] 一句话标题,intent next/status 输出时优先展示",
|
|
17
|
-
"narrative_ref": "01_VISION.md#int-001",
|
|
18
|
-
"depends_on": [],
|
|
19
|
-
"acceptance": "[必须] 完成契约:什么算可观察地完成,包含功能承诺、关键失败边界和防御承诺。可内联或引用 05_VERIFICATION.md。",
|
|
20
|
-
"continuity_required": "[可选] true:本 Intent 改动既有用户/系统状态,必须在 acceptance 写明保留项与时序验证;验证时额外要求 preservation_achievement。一次性、无既有状态任务省略。",
|
|
21
|
-
"quality_contract": "[可选] 只有声明高于功能正确性的质量目标时才填写;若引用 05_VERIFICATION.md,必须先创建对应章节。",
|
|
22
|
-
"quality_strategy": "adaptive",
|
|
23
|
-
"capability_needs": ["visual hierarchy", "responsive interaction"],
|
|
24
|
-
"creative_scope": "可以改变布局与动效;不得改变业务流程、数据结构和公开接口。",
|
|
25
|
-
"philosophy_anchors": ["PRODUCT_PHILOSOPHY.md#core-belief", "ENGINEERING_CREED.md#anti-patterns"],
|
|
26
|
-
"status": "pending",
|
|
27
|
-
"_optional": {
|
|
28
|
-
"estimated_effort": "2h-2d",
|
|
29
|
-
"priority": "high|medium|low",
|
|
30
|
-
"sprint": "S1",
|
|
31
|
-
"system_id": "引用 02_ARCHITECTURE.md 中的系统 ID",
|
|
32
|
-
"verification_method": "[可选] L2 运行时验证的验证方式。如 'run tests/perf/test-001.js' 或 'exec scripts/eval.py --intent INT-001'。未定义时 Keeper 默认用 L1 静态审查。L3 人类反馈时填 'human_review'。"
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
"INT-002": {
|
|
36
|
-
"id": "INT-002",
|
|
37
|
-
"revision": 1,
|
|
38
|
-
"title": "...",
|
|
39
|
-
"narrative_ref": "01_VISION.md#int-002",
|
|
40
|
-
"depends_on": ["INT-001"],
|
|
41
|
-
"acceptance": "...",
|
|
42
|
-
"philosophy_anchors": ["..."],
|
|
43
|
-
"status": "pending"
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
"topo_order": ["INT-001", "INT-002"],
|
|
48
|
-
|
|
49
|
-
"_field_reference": {
|
|
50
|
-
"id": "[必须] 稳定标识,项目生命周期内不变",
|
|
51
|
-
"revision": "[必须] 正整数,从 1 开始;Intent 语义或验收契约变化时递增,只有 status 变化时保持不变。旧 Map 缺失时兼容视为 1。",
|
|
52
|
-
"title": "[必须] 一句话标题,intent next/status 输出时优先展示",
|
|
53
|
-
"narrative_ref": "[必须] 指向愿景文档中意图叙事的章节锚点",
|
|
54
|
-
"depends_on": "[必须] 前置 Intent ID 列表。空数组表示无依赖。",
|
|
55
|
-
"acceptance": "[必须] 完成契约的真相源。内联或引用 05_VERIFICATION.md。",
|
|
56
|
-
"continuity_required": "[可选] true:只作为状态守恒验证的开关;保留规则和验证序列仍写在 acceptance,避免制造第二份真相源。",
|
|
57
|
-
"quality_contract": "[可选] 质量契约。结果需要高于功能正确性时使用;声明相对提升时必须定义基线、质量主张、最小有意义差异和证据方式。",
|
|
58
|
-
"quality_strategy": "[可选] adaptive | atelier,缺失等价于 adaptive。atelier 只用于明确需要作者命题、媒介原型和独立候选比较的 Intent,并要求 quality_contract 与 creative_scope。",
|
|
59
|
-
"capability_needs": "[可选] Expertise Compiler 需要补齐的专业领域字符串数组。",
|
|
60
|
-
"creative_scope": "[可选] Forge 可以大胆改变什么、必须保持什么。",
|
|
61
|
-
"semantic_guard": "[可选] 当叙事核心容易被相似实现偷换时,写明不算完成的替代物与 Keeper 的反例验证方式。",
|
|
62
|
-
"philosophy_anchors": "[必须] 哲学文档引用列表。Forge 加载哲学的指引。",
|
|
63
|
-
"status": "[必须] pending | in_progress | completed | blocked | needs_review",
|
|
64
|
-
"lifecycle.deprecation": "[可选] { deprecated_at, reason, replacement }。与 status 分离;弃用后 status 保持 completed。",
|
|
65
|
-
"lineage": "[可选] { predecessors: [{ version: 'v1', intent_id: 'INT-003' }], change_summary, change_ref? }。只表达跨版本语义沿革,不得放入 depends_on。",
|
|
66
|
-
"_optional.verification_method": "[可选] L2 运行时验证方式(如 'run tests/...')或 L3 'human_review'。未定义时默认 L1 静态审查。",
|
|
67
|
-
"_optional": "[自由] Architect 可根据项目需要增加字段"
|
|
68
|
-
},
|
|
69
|
-
|
|
70
|
-
"_status_reference": {
|
|
71
|
-
"pending": "未开始。依赖满足后可被 Keeper 选中。",
|
|
72
|
-
"in_progress": "Forge 正在实现。",
|
|
73
|
-
"completed": "Keeper 验证通过,已闭合。",
|
|
74
|
-
"blocked": "无法推进。需要外部介入。",
|
|
75
|
-
"needs_review": "已完成但受变更回流影响,需要重新验证。由 Architect 在变更回流时标记。"
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
"_cli_interface": {
|
|
79
|
-
"_note": "CLI 工具读取此文件提供查询能力。Agent 通过 CLI 访问,不直接读文件。",
|
|
80
|
-
"intent_next": "返回 topo_order 中第一个 status=pending 且 depends_on 全部 completed 的 Intent",
|
|
81
|
-
"intent_status": "统计各状态数量",
|
|
82
|
-
"intent_graph": "输出依赖图(Mermaid 或 ASCII)",
|
|
83
|
-
"intent_get": "按 ID 返回完整 Intent 信息"
|
|
84
|
-
}
|
|
85
|
-
}
|