@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
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<mxfile host="app.diagrams.net" modified="2026-08-09T22:30:00.000Z" agent="Codex" version="24.7.17">
|
|
2
|
+
<diagram id="loom-eval" name="LOOM Evil Eval">
|
|
3
|
+
<mxGraphModel dx="1600" dy="860" grid="1" gridSize="10" guides="1" page="1" pageScale="1" pageWidth="1600" pageHeight="860"><root><mxCell id="0"/><mxCell id="1" parent="0"/>
|
|
4
|
+
<mxCell id="title" value="The Evil Eval: does LOOM cause the gain?" style="text;html=1;fontSize=28;fontStyle=1;fontColor=#17212B;align=left;" vertex="1" parent="1"><mxGeometry x="70" y="30" width="900" height="50" as="geometry"/></mxCell>
|
|
5
|
+
<mxCell id="controls" value="FREEZE EVERYTHING EXCEPT THE TREATMENT<br>same model · same tools · same workspace · same hidden user facts · same budget · same reset schedule · ≥ 3 repeats" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#17212B;strokeColor=#17212B;fontColor=#F5F2EA;fontStyle=1;align=left;spacingLeft=24;" vertex="1" parent="1"><mxGeometry x="70" y="110" width="1460" height="90" as="geometry"/></mxCell>
|
|
6
|
+
<mxCell id="a-band" value="A · BASELINE — Normal Agent, no LOOM" style="swimlane;horizontal=1;startSize=52;rounded=1;fillColor=#FBFAF6;swimlaneFillColor=#FBFAF6;strokeColor=#C7C2B8;fontColor=#58636D;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="70" y="240" width="700" height="270" as="geometry"/></mxCell>
|
|
7
|
+
<mxCell id="b-band" value="B · TREATMENT — Same Agent, LOOM available" style="swimlane;horizontal=1;startSize=52;rounded=1;fillColor=#FBFAF6;swimlaneFillColor=#FBFAF6;strokeColor=#4169E1;fontColor=#4169E1;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="830" y="240" width="700" height="270" as="geometry"/></mxCell>
|
|
8
|
+
<mxCell id="a1" value="<b>Shape project</b><br>questions · decisions<br>plans · documents" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="105" y="335" width="175" height="85" as="geometry"/></mxCell><mxCell id="a2" value="<b>Force reset</b><br>after shaping<br>and mid-Task" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F9E4DE;strokeColor=#E88773;" vertex="1" parent="1"><mxGeometry x="330" y="335" width="175" height="85" as="geometry"/></mxCell><mxCell id="a3" value="<b>Fresh Agent</b><br>continue from disk<br>build vertical slice" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="555" y="335" width="175" height="85" as="geometry"/></mxCell>
|
|
9
|
+
<mxCell id="b1" value="<b>Shape with LOOM</b><br>same brief and Agent<br>treatment only" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4169E1;" vertex="1" parent="1"><mxGeometry x="865" y="335" width="175" height="85" as="geometry"/></mxCell><mxCell id="b2" value="<b>Force reset</b><br>identical timing<br>identical budget" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F9E4DE;strokeColor=#E88773;" vertex="1" parent="1"><mxGeometry x="1090" y="335" width="175" height="85" as="geometry"/></mxCell><mxCell id="b3" value="<b>Fresh Agent</b><br>use LOOM disk truth<br>build vertical slice" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8ECFA;strokeColor=#4169E1;" vertex="1" parent="1"><mxGeometry x="1315" y="335" width="175" height="85" as="geometry"/></mxCell>
|
|
10
|
+
<mxCell id="ae1" edge="1" source="a1" target="a2" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="ae2" edge="1" source="a2" target="a3" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="be1" edge="1" source="b1" target="b2" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="be2" edge="1" source="b2" target="b3" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/>
|
|
11
|
+
<mxCell id="collect-a" value="COLLECT · questions · docs · code · tests · time · tokens · user burden" style="text;html=1;fontSize=11;fontColor=#58636D;align=left;" vertex="1" parent="1"><mxGeometry x="105" y="450" width="610" height="30" as="geometry"/></mxCell><mxCell id="collect-b" value="COLLECT · the same artifact classes, under the same stopping rule" style="text;html=1;fontSize=11;fontColor=#58636D;align=left;" vertex="1" parent="1"><mxGeometry x="865" y="450" width="610" height="30" as="geometry"/></mxCell>
|
|
12
|
+
<mxCell id="judge" value="BLIND PAIRWISE JUDGE<br><b>Anonymize → randomize → swap order</b><br>Preflight the packet; repeat ≥ 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#E88773;fontColor=#17212B;" vertex="1" parent="1"><mxGeometry x="590" y="560" width="420" height="105" as="geometry"/></mxCell>
|
|
13
|
+
<mxCell id="aj" edge="1" source="a-band" target="judge" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="bj" edge="1" source="b-band" target="judge" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/>
|
|
14
|
+
<mxCell id="score" value="<b>SCORE NET VALUE</b><br>intent · question value · buildability<br>continuity · burden · cost · ceremony" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="120" y="720" width="280" height="85" as="geometry"/></mxCell>
|
|
15
|
+
<mxCell id="gain" value="Reliable net gain across repeats?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4169E1;" vertex="1" parent="1"><mxGeometry x="520" y="710" width="230" height="105" as="geometry"/></mxCell>
|
|
16
|
+
<mxCell id="yes" value="YES · ABLATE<br><b>Find the causal mechanism</b><br>keep only what creates the gain" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F3ED;strokeColor=#9AD8C2;" vertex="1" parent="1"><mxGeometry x="870" y="720" width="250" height="85" as="geometry"/></mxCell>
|
|
17
|
+
<mxCell id="no" value="NO · BE EVIL<br><b>Simplify, revise, or delete</b><br>ceremony gets no sympathy" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F9E4DE;strokeColor=#E88773;" vertex="1" parent="1"><mxGeometry x="1230" y="720" width="250" height="85" as="geometry"/></mxCell>
|
|
18
|
+
<mxCell id="js" edge="1" source="judge" target="score" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="sg" edge="1" source="score" target="gain" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="gy" value="yes" edge="1" source="gain" target="yes" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="gn" value="no" edge="1" source="gain" target="no" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="635" y="835"/><mxPoint x="1355" y="835"/></Array></mxGeometry></mxCell>
|
|
19
|
+
</root></mxGraphModel>
|
|
20
|
+
</diagram>
|
|
21
|
+
</mxfile>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="860" viewBox="0 0 1600 860" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">LOOM Evil Eval</title>
|
|
3
|
+
<desc id="desc">A controlled comparison between the same capable Agent without a framework and with LOOM, followed by blinded judging and ablation.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<marker id="a" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0 10 5 0 10Z" fill="#17212B"/></marker>
|
|
6
|
+
<marker id="ba" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0 10 5 0 10Z" fill="#4169E1"/></marker>
|
|
7
|
+
<style>text{font-family:Inter,Segoe UI,Arial,sans-serif;fill:#17212B}.title{font-size:34px;font-weight:760}.subtitle{font-size:16px;fill:#58636D}.eyebrow{font-size:11px;font-weight:760;letter-spacing:1.35px}.h{font-size:16px;font-weight:720}.body{font-size:12px;fill:#58636D}.small{font-size:11px;font-weight:690}.inverse{fill:#F5F2EA}.mint{fill:#9AD8C2}.edge{fill:none;stroke:#17212B;stroke-width:2.2;marker-end:url(#a)}.feedback{fill:none;stroke:#4169E1;stroke-width:2.3;stroke-dasharray:7 7;marker-end:url(#ba)}</style>
|
|
8
|
+
</defs>
|
|
9
|
+
<rect width="1600" height="860" fill="#F5F2EA"/>
|
|
10
|
+
<text class="title" x="70" y="62">The Evil Eval: does LOOM cause the gain?</text>
|
|
11
|
+
<text class="subtitle" x="70" y="92">Primary comparison: the same capable Agent, with and without the framework—not LOOM 2 versus its weaker ancestor.</text>
|
|
12
|
+
|
|
13
|
+
<rect x="70" y="128" width="1460" height="92" rx="20" fill="#17212B"/>
|
|
14
|
+
<text class="eyebrow mint" x="98" y="158">FREEZE EVERYTHING EXCEPT THE TREATMENT</text>
|
|
15
|
+
<g font-family="ui-monospace,SFMono-Regular,Consolas,monospace" font-size="13">
|
|
16
|
+
<text class="inverse" x="98" y="190">same model</text><text class="inverse" x="264" y="190">same tools</text><text class="inverse" x="416" y="190">same workspace</text><text class="inverse" x="600" y="190">same hidden user facts</text><text class="inverse" x="846" y="190">same budget</text><text class="inverse" x="996" y="190">same reset schedule</text><text class="inverse" x="1240" y="190">≥ 3 repeats</text>
|
|
17
|
+
</g>
|
|
18
|
+
|
|
19
|
+
<!-- parallel lanes -->
|
|
20
|
+
<g>
|
|
21
|
+
<rect x="70" y="258" width="702" height="276" rx="22" fill="#FBFAF6" stroke="#D8D3C8"/>
|
|
22
|
+
<rect x="70" y="258" width="10" height="276" rx="5" fill="#C7C2B8"/>
|
|
23
|
+
<rect x="828" y="258" width="702" height="276" rx="22" fill="#FBFAF6" stroke="#D8D3C8"/>
|
|
24
|
+
<rect x="828" y="258" width="10" height="276" rx="5" fill="#4169E1"/>
|
|
25
|
+
<text class="eyebrow" x="104" y="292" fill="#58636D">A · BASELINE</text><text class="h" x="104" y="320">Normal Agent, no LOOM</text>
|
|
26
|
+
<text class="eyebrow" x="862" y="292" fill="#4169E1">B · TREATMENT</text><text class="h" x="862" y="320">Same Agent, LOOM available</text>
|
|
27
|
+
<g transform="translate(104 352)"><rect width="176" height="88" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/><text class="h" x="14" y="33">Shape the project</text><text class="body" x="14" y="55">questions · decisions</text><text class="body" x="14" y="72">plans · documents</text></g>
|
|
28
|
+
<g transform="translate(332 352)"><rect width="176" height="88" rx="14" fill="#F9E4DE" stroke="#E88773"/><text class="h" x="14" y="33">Force reset</text><text class="body" x="14" y="55">after shaping</text><text class="body" x="14" y="72">and mid-Task</text></g>
|
|
29
|
+
<g transform="translate(560 352)"><rect width="176" height="88" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/><text class="h" x="14" y="33">Fresh Agent</text><text class="body" x="14" y="55">continue from disk</text><text class="body" x="14" y="72">build vertical slice</text></g>
|
|
30
|
+
<path class="edge" d="M280 396H332"/><path class="edge" d="M508 396H560"/>
|
|
31
|
+
<g transform="translate(862 352)"><rect width="176" height="88" rx="14" fill="#FFFFFF" stroke="#4169E1"/><text class="h" x="14" y="33">Shape with LOOM</text><text class="body" x="14" y="55">same brief and Agent</text><text class="body" x="14" y="72">treatment only</text></g>
|
|
32
|
+
<g transform="translate(1090 352)"><rect width="176" height="88" rx="14" fill="#F9E4DE" stroke="#E88773"/><text class="h" x="14" y="33">Force reset</text><text class="body" x="14" y="55">identical timing</text><text class="body" x="14" y="72">identical budget</text></g>
|
|
33
|
+
<g transform="translate(1318 352)"><rect width="176" height="88" rx="14" fill="#E8ECFA" stroke="#4169E1"/><text class="h" x="14" y="33">Fresh Agent</text><text class="body" x="14" y="55">use LOOM disk truth</text><text class="body" x="14" y="72">build vertical slice</text></g>
|
|
34
|
+
<path class="edge" d="M1038 396H1090"/><path class="edge" d="M1266 396H1318"/>
|
|
35
|
+
<text class="small" x="104" y="483">COLLECT</text><text class="body" x="104" y="505">questions · docs · code · tests · time · tokens · user burden · failure recovery</text>
|
|
36
|
+
<text class="small" x="862" y="483">COLLECT</text><text class="body" x="862" y="505">the same artifact classes, under the same stopping rule</text>
|
|
37
|
+
</g>
|
|
38
|
+
|
|
39
|
+
<!-- judging -->
|
|
40
|
+
<g>
|
|
41
|
+
<path class="edge" d="M421 534V580H590"/><path class="edge" d="M1179 534V580H1010"/>
|
|
42
|
+
<rect x="590" y="558" width="420" height="108" rx="20" fill="#FFFFFF" stroke="#E88773" stroke-width="1.5"/>
|
|
43
|
+
<text class="eyebrow" x="800" y="588" text-anchor="middle" fill="#A84D3C">BLIND PAIRWISE JUDGE</text>
|
|
44
|
+
<text class="h" x="800" y="617" text-anchor="middle">Anonymize → randomize → swap order</text>
|
|
45
|
+
<text class="body" x="800" y="642" text-anchor="middle">Preflight the judge packet; broken harness evidence cannot become product evidence.</text>
|
|
46
|
+
</g>
|
|
47
|
+
<g transform="translate(122 708)">
|
|
48
|
+
<rect width="278" height="84" rx="16" fill="#FFFFFF" stroke="#C7C2B8"/>
|
|
49
|
+
<text class="eyebrow" x="16" y="26" fill="#58636D">SCORE NET VALUE</text><text class="body" x="16" y="49">intent · question value · buildability</text><text class="body" x="16" y="67">continuity · burden · cost · ceremony</text>
|
|
50
|
+
</g>
|
|
51
|
+
<g transform="translate(522 698)"><path d="M114 0 228 52 114 104 0 52Z" fill="#FFFFFF" stroke="#4169E1" stroke-width="1.5"/><text class="h" x="114" y="48" text-anchor="middle">Reliable net gain?</text><text class="body" x="114" y="68" text-anchor="middle">across repeats</text></g>
|
|
52
|
+
<g transform="translate(872 708)"><rect width="250" height="84" rx="16" fill="#E3F3ED" stroke="#9AD8C2"/><text class="eyebrow" x="16" y="26" fill="#367D67">YES · ABLATE</text><text class="h" x="16" y="50">Find the causal mechanism</text><text class="body" x="16" y="69">keep only what creates the gain</text></g>
|
|
53
|
+
<g transform="translate(1234 708)"><rect width="250" height="84" rx="16" fill="#F9E4DE" stroke="#E88773"/><text class="eyebrow" x="16" y="26" fill="#A84D3C">NO · BE EVIL</text><text class="h" x="16" y="50">Simplify, revise, or delete</text><text class="body" x="16" y="69">ceremony gets no sympathy</text></g>
|
|
54
|
+
<path class="edge" d="M590 634H261V708"/><path class="edge" d="M400 750H522"/><path class="edge" d="M750 750H872"/><text class="small" x="792" y="738">YES</text><path class="edge" d="M636 802V826H1359V792"/><text class="small" x="664" y="820">NO</text>
|
|
55
|
+
<text class="body" x="70" y="842">A single pilot is directional evidence, not a statistical conclusion. Optional LOOM 1 runs are regression checks—not the primary baseline.</text>
|
|
56
|
+
</svg>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<mxfile host="app.diagrams.net" modified="2026-08-09T22:30:00.000Z" agent="Codex" version="24.7.17">
|
|
2
|
+
<diagram id="loom-production" name="LOOM Production Loops">
|
|
3
|
+
<mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
|
|
4
|
+
<root><mxCell id="0"/><mxCell id="1" parent="0"/>
|
|
5
|
+
<mxCell id="title" value="One system. Three honest loops." style="text;html=1;fontSize=30;fontStyle=1;fontColor=#17212B;align=left;" vertex="1" parent="1"><mxGeometry x="50" y="30" width="700" height="50" as="geometry"/></mxCell>
|
|
6
|
+
<mxCell id="u-band" value="01 · UNDERSTANDING LOOP" style="swimlane;horizontal=1;startSize=52;rounded=1;arcSize=8;fillColor=#FBFAF6;swimlaneFillColor=#FBFAF6;strokeColor=#9AD8C2;fontColor=#367D67;fontStyle=1;fontSize=16;" vertex="1" parent="1"><mxGeometry x="50" y="110" width="1500" height="240" as="geometry"/></mxCell>
|
|
7
|
+
<mxCell id="u1" value="HUMAN<br><b>Natural request</b><br>idea · correction · answer" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;fontColor=#17212B;" vertex="1" parent="1"><mxGeometry x="90" y="205" width="185" height="80" as="geometry"/></mxCell>
|
|
8
|
+
<mxCell id="u2" value="AGENT<br><b>Describe the result</b><br>inspect only when relevant" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;fontColor=#17212B;" vertex="1" parent="1"><mxGeometry x="325" y="205" width="215" height="80" as="geometry"/></mxCell>
|
|
9
|
+
<mxCell id="u3" value="Material unknowns still change the whole?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4169E1;fontColor=#17212B;" vertex="1" parent="1"><mxGeometry x="590" y="195" width="190" height="100" as="geometry"/></mxCell>
|
|
10
|
+
<mxCell id="u4" value="<b>Ask one dense round</b><br>adaptive · consequential<br>not a fixed questionnaire" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;fontColor=#17212B;" vertex="1" parent="1"><mxGeometry x="830" y="205" width="205" height="80" as="geometry"/></mxCell>
|
|
11
|
+
<mxCell id="u5" value="<b>Update project truth</b><br>facts · decisions · designs<br>separate field dossiers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;fontColor=#17212B;" vertex="1" parent="1"><mxGeometry x="1085" y="205" width="215" height="80" as="geometry"/></mxCell>
|
|
12
|
+
<mxCell id="u6" value="<b>Build-ready</b><br>candidate" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F3ED;strokeColor=#9AD8C2;fontColor=#17212B;" vertex="1" parent="1"><mxGeometry x="1350" y="205" width="150" height="80" as="geometry"/></mxCell>
|
|
13
|
+
<mxCell id="u-e1" edge="1" source="u1" target="u2" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;endArrow=block;strokeColor=#17212B;"/><mxCell id="u-e2" edge="1" source="u2" target="u3" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;endArrow=block;strokeColor=#17212B;"/><mxCell id="u-e3" value="yes" edge="1" source="u3" target="u4" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;endArrow=block;strokeColor=#17212B;"/><mxCell id="u-e4" edge="1" source="u4" target="u5" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;endArrow=block;strokeColor=#17212B;"/>
|
|
14
|
+
<mxCell id="u-no" value="no · local gaps only" edge="1" source="u3" target="u6" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;endArrow=block;strokeColor=#17212B;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="685" y="310"/><mxPoint x="1425" y="310"/></Array></mxGeometry></mxCell>
|
|
15
|
+
<mxCell id="u-loop" value="re-evaluate" edge="1" source="u5" target="u3" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;dashed=1;dashPattern=8 8;endArrow=block;strokeColor=#4169E1;fontColor=#4169E1;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1190" y="330"/><mxPoint x="685" y="330"/></Array></mxGeometry></mxCell>
|
|
16
|
+
|
|
17
|
+
<mxCell id="k-band" value="02 · KEEPER LOOP" style="swimlane;horizontal=1;startSize=52;rounded=1;arcSize=8;fillColor=#FBFAF6;swimlaneFillColor=#FBFAF6;strokeColor=#E88773;fontColor=#A84D3C;fontStyle=1;fontSize=16;" vertex="1" parent="1"><mxGeometry x="50" y="390" width="1500" height="240" as="geometry"/></mxCell>
|
|
18
|
+
<mxCell id="k1" value="<b>Validate + freeze digest</b><br>PROJECT · designs · dossiers<br>Work Map · first Task" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="90" y="485" width="220" height="80" as="geometry"/></mxCell>
|
|
19
|
+
<mxCell id="k2" value="FRESH AGENT<br><b>Independently inspect</b><br>same frozen digest" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#E88773;" vertex="1" parent="1"><mxGeometry x="360" y="485" width="220" height="80" as="geometry"/></mxCell>
|
|
20
|
+
<mxCell id="k3" value="Can responsibly start the first Task?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#E88773;" vertex="1" parent="1"><mxGeometry x="630" y="475" width="200" height="100" as="geometry"/></mxCell>
|
|
21
|
+
<mxCell id="k4" value="<b>Return exact gaps</b><br>needs_revision / blocked<br>evidence · files · consequences" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F9E4DE;strokeColor=#E88773;" vertex="1" parent="1"><mxGeometry x="880" y="485" width="220" height="80" as="geometry"/></mxCell>
|
|
22
|
+
<mxCell id="k5" value="<b>Repair the source</b><br>new digest<br>different fresh Keeper" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="1150" y="485" width="180" height="80" as="geometry"/></mxCell>
|
|
23
|
+
<mxCell id="k6" value="<b>Passed</b><br>handoff once" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F3ED;strokeColor=#9AD8C2;" vertex="1" parent="1"><mxGeometry x="1380" y="485" width="130" height="80" as="geometry"/></mxCell>
|
|
24
|
+
<mxCell id="k-e1" edge="1" source="k1" target="k2" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="k-e2" edge="1" source="k2" target="k3" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="k-e3" value="no" edge="1" source="k3" target="k4" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="k-e4" edge="1" source="k4" target="k5" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="k-yes" value="yes" edge="1" source="k3" target="k6" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="730" y="450"/><mxPoint x="1445" y="450"/></Array></mxGeometry></mxCell>
|
|
25
|
+
<mxCell id="k-loop" value="new digest · new run_id · new Keeper" edge="1" source="k5" target="k2" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;dashed=1;dashPattern=8 8;endArrow=block;strokeColor=#4169E1;fontColor=#4169E1;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1240" y="600"/><mxPoint x="470" y="600"/></Array></mxGeometry></mxCell>
|
|
26
|
+
|
|
27
|
+
<mxCell id="d-band" value="03 · DELIVERY LOOP" style="swimlane;horizontal=1;startSize=52;rounded=1;arcSize=8;fillColor=#FBFAF6;swimlaneFillColor=#FBFAF6;strokeColor=#4169E1;fontColor=#4169E1;fontStyle=1;fontSize=16;" vertex="1" parent="1"><mxGeometry x="50" y="670" width="1500" height="270" as="geometry"/></mxCell>
|
|
28
|
+
<mxCell id="d1" value="<b>Select next Task</b><br>dependencies satisfied<br>active horizon only" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="90" y="770" width="180" height="80" as="geometry"/></mxCell>
|
|
29
|
+
<mxCell id="d2" value="<b>Compile exact context</b><br>reads · constraints<br>done conditions · evidence" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="315" y="770" width="205" height="80" as="geometry"/></mxCell>
|
|
30
|
+
<mxCell id="d3" value="<b>Build → observe</b><br>test → adjust<br>keep local failures local" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C7C2B8;" vertex="1" parent="1"><mxGeometry x="565" y="770" width="190" height="80" as="geometry"/></mxCell>
|
|
31
|
+
<mxCell id="d4" value="Done conditions actually proven?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4169E1;" vertex="1" parent="1"><mxGeometry x="800" y="760" width="180" height="100" as="geometry"/></mxCell>
|
|
32
|
+
<mxCell id="d5" value="<b>Record exact evidence</b><br>complete / block / reopen<br>preserve what comes next" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8ECFA;strokeColor=#4169E1;" vertex="1" parent="1"><mxGeometry x="1025" y="770" width="205" height="80" as="geometry"/></mxCell>
|
|
33
|
+
<mxCell id="d6" value="More Tasks or new upper gap?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4169E1;" vertex="1" parent="1"><mxGeometry x="1275" y="760" width="170" height="100" as="geometry"/></mxCell>
|
|
34
|
+
<mxCell id="d7" value="DELIVER" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#17212B;strokeColor=#17212B;fontColor=#F5F2EA;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="1470" y="780" width="60" height="60" as="geometry"/></mxCell>
|
|
35
|
+
<mxCell id="d-e1" edge="1" source="d1" target="d2" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="d-e2" edge="1" source="d2" target="d3" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="d-e3" edge="1" source="d3" target="d4" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="d-e4" value="yes" edge="1" source="d4" target="d5" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="d-e5" edge="1" source="d5" target="d6" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/><mxCell id="d-e6" value="done" edge="1" source="d6" target="d7" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;endArrow=block;"/>
|
|
36
|
+
<mxCell id="d-local" value="local no · iterate" edge="1" source="d4" target="d3" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;dashed=1;dashPattern=8 8;endArrow=block;strokeColor=#4169E1;fontColor=#4169E1;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="890" y="890"/><mxPoint x="660" y="890"/></Array></mxGeometry></mxCell>
|
|
37
|
+
<mxCell id="d-more" value="more Tasks · or block → repair upper source → reopen" edge="1" source="d6" target="d1" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;rounded=1;dashed=1;dashPattern=8 8;endArrow=block;strokeColor=#4169E1;fontColor=#4169E1;"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1360" y="920"/><mxPoint x="180" y="920"/></Array></mxGeometry></mxCell>
|
|
38
|
+
</root>
|
|
39
|
+
</mxGraphModel>
|
|
40
|
+
</diagram>
|
|
41
|
+
</mxfile>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1000" viewBox="0 0 1600 1000" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">The LOOM production loop</title>
|
|
3
|
+
<desc id="desc">Three clean feedback loops for understanding, independent Keeper review, and restartable task delivery.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0 10 5 0 10Z" fill="#17212B"/></marker>
|
|
6
|
+
<marker id="blue-arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0 10 5 0 10Z" fill="#4169E1"/></marker>
|
|
7
|
+
<style>
|
|
8
|
+
text{font-family:Inter,Segoe UI,Arial,sans-serif;fill:#17212B}.title{font-size:34px;font-weight:760}.subtitle{font-size:16px;fill:#58636D}.band-title{font-size:19px;font-weight:740}.eyebrow{font-size:11px;font-weight:750;letter-spacing:1.4px}.node-title{font-size:15px;font-weight:700}.body{font-size:12px;fill:#58636D}.label{font-size:11px;font-weight:720}.edge{fill:none;stroke:#17212B;stroke-width:2.2;marker-end:url(#arrow)}.loop{fill:none;stroke:#4169E1;stroke-width:2.4;stroke-dasharray:7 7;marker-end:url(#blue-arrow)}
|
|
9
|
+
</style>
|
|
10
|
+
</defs>
|
|
11
|
+
<rect width="1600" height="1000" fill="#F5F2EA"/>
|
|
12
|
+
<text class="title" x="70" y="64">One system. Three honest loops.</text>
|
|
13
|
+
<text class="subtitle" x="70" y="94">The human talks naturally. The Agent thinks and acts. LOOM quietly preserves state, context, and proof.</text>
|
|
14
|
+
<g transform="translate(1290 50)"><circle cx="6" cy="6" r="6" fill="#4169E1"/><text class="eyebrow" x="22" y="10">FOR AI AGENTS, NOT END USERS</text></g>
|
|
15
|
+
|
|
16
|
+
<!-- Understanding loop -->
|
|
17
|
+
<g>
|
|
18
|
+
<rect x="48" y="130" width="1504" height="246" rx="24" fill="#FBFAF6" stroke="#D8D3C8"/>
|
|
19
|
+
<rect x="48" y="130" width="12" height="246" rx="6" fill="#9AD8C2"/>
|
|
20
|
+
<text class="eyebrow" x="86" y="163" fill="#367D67">01 · UNDERSTANDING LOOP</text>
|
|
21
|
+
<text class="band-title" x="86" y="192">Find the whole before pretending to know the task.</text>
|
|
22
|
+
<g transform="translate(86 224)">
|
|
23
|
+
<rect width="190" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/>
|
|
24
|
+
<rect x="14" y="13" width="52" height="20" rx="10" fill="#E3F3ED"/><text class="eyebrow" x="40" y="27" text-anchor="middle" fill="#367D67">HUMAN</text>
|
|
25
|
+
<text class="node-title" x="14" y="54">Natural request</text><text class="body" x="14" y="71">idea · correction · answer</text>
|
|
26
|
+
</g>
|
|
27
|
+
<g transform="translate(326 224)">
|
|
28
|
+
<rect width="224" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/>
|
|
29
|
+
<rect x="14" y="13" width="48" height="20" rx="10" fill="#E8ECFA"/><text class="eyebrow" x="38" y="27" text-anchor="middle" fill="#4169E1">AGENT</text>
|
|
30
|
+
<text class="node-title" x="14" y="54">Describe the result</text><text class="body" x="14" y="71">inspect only when relevant</text>
|
|
31
|
+
</g>
|
|
32
|
+
<g transform="translate(598 214)">
|
|
33
|
+
<path d="M96 0 192 51 96 102 0 51Z" fill="#FFFFFF" stroke="#4169E1" stroke-width="1.5"/>
|
|
34
|
+
<text class="node-title" x="96" y="46" text-anchor="middle">Material unknowns</text><text class="body" x="96" y="65" text-anchor="middle">still change the whole?</text>
|
|
35
|
+
</g>
|
|
36
|
+
<g transform="translate(838 224)">
|
|
37
|
+
<rect width="210" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/>
|
|
38
|
+
<text class="node-title" x="14" y="35">Ask one dense round</text><text class="body" x="14" y="55">adaptive · consequential</text><text class="body" x="14" y="72">not a fixed questionnaire</text>
|
|
39
|
+
</g>
|
|
40
|
+
<g transform="translate(1096 224)">
|
|
41
|
+
<rect width="218" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/>
|
|
42
|
+
<text class="node-title" x="14" y="35">Update project truth</text><text class="body" x="14" y="55">facts · decisions · designs</text><text class="body" x="14" y="72">separate field dossiers</text>
|
|
43
|
+
</g>
|
|
44
|
+
<g transform="translate(1362 224)">
|
|
45
|
+
<rect width="150" height="82" rx="14" fill="#E3F3ED" stroke="#9AD8C2"/>
|
|
46
|
+
<text class="node-title" x="75" y="37" text-anchor="middle">Build-ready</text><text class="body" x="75" y="58" text-anchor="middle">candidate</text>
|
|
47
|
+
</g>
|
|
48
|
+
<path class="edge" d="M276 265H326"/><path class="edge" d="M550 265H598"/>
|
|
49
|
+
<path class="edge" d="M790 265H838"/><text class="label" x="804" y="253">YES</text>
|
|
50
|
+
<path class="edge" d="M1048 265H1096"/>
|
|
51
|
+
<path class="loop" d="M1205 306V354H694V316"/><text class="label" x="826" y="369" fill="#4169E1">RE-EVALUATE AFTER EVERY MATERIAL ANSWER</text>
|
|
52
|
+
<path class="edge" d="M694 214V205H1437V224"/><text class="label" x="814" y="198">NO · REMAINING GAPS ARE LOCAL OR USER ACCEPTS THE COST</text>
|
|
53
|
+
</g>
|
|
54
|
+
|
|
55
|
+
<!-- Keeper loop -->
|
|
56
|
+
<g>
|
|
57
|
+
<rect x="48" y="404" width="1504" height="246" rx="24" fill="#FBFAF6" stroke="#D8D3C8"/>
|
|
58
|
+
<rect x="48" y="404" width="12" height="246" rx="6" fill="#E88773"/>
|
|
59
|
+
<text class="eyebrow" x="86" y="437" fill="#A84D3C">02 · KEEPER LOOP</text>
|
|
60
|
+
<text class="band-title" x="86" y="466">A stranger must be able to start—otherwise the project is not ready.</text>
|
|
61
|
+
<g transform="translate(86 498)"><rect width="220" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/><text class="node-title" x="14" y="34">Validate + freeze digest</text><text class="body" x="14" y="55">PROJECT · designs · dossiers</text><text class="body" x="14" y="72">Work Map · first Task</text></g>
|
|
62
|
+
<g transform="translate(358 498)"><rect width="220" height="82" rx="14" fill="#FFFFFF" stroke="#E88773"/><rect x="14" y="13" width="94" height="20" rx="10" fill="#F9E4DE"/><text class="eyebrow" x="61" y="27" text-anchor="middle" fill="#A84D3C">FRESH AGENT</text><text class="node-title" x="14" y="55">Independently inspect</text><text class="body" x="14" y="72">same frozen project digest</text></g>
|
|
63
|
+
<g transform="translate(630 488)"><path d="M100 0 200 51 100 102 0 51Z" fill="#FFFFFF" stroke="#E88773" stroke-width="1.5"/><text class="node-title" x="100" y="46" text-anchor="middle">Can responsibly</text><text class="body" x="100" y="65" text-anchor="middle">start the first Task?</text></g>
|
|
64
|
+
<g transform="translate(882 498)"><rect width="220" height="82" rx="14" fill="#F9E4DE" stroke="#E88773"/><text class="node-title" x="14" y="34">Return exact gaps</text><text class="body" x="14" y="55">needs_revision / blocked</text><text class="body" x="14" y="72">evidence · files · consequences</text></g>
|
|
65
|
+
<g transform="translate(1154 498)"><rect width="180" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/><text class="node-title" x="14" y="34">Repair the source</text><text class="body" x="14" y="55">new digest</text><text class="body" x="14" y="72">different fresh Keeper</text></g>
|
|
66
|
+
<g transform="translate(1386 498)"><rect width="126" height="82" rx="14" fill="#E3F3ED" stroke="#9AD8C2"/><text class="node-title" x="63" y="37" text-anchor="middle">Passed</text><text class="body" x="63" y="58" text-anchor="middle">handoff once</text></g>
|
|
67
|
+
<path class="edge" d="M306 539H358"/><path class="edge" d="M578 539H630"/>
|
|
68
|
+
<path class="edge" d="M830 539H882"/><text class="label" x="846" y="527">NO</text><path class="edge" d="M1102 539H1154"/>
|
|
69
|
+
<path class="loop" d="M1244 580V616H468V580"/><text class="label" x="720" y="633" fill="#4169E1">REPAIR → NEW DIGEST → NEW RUN_ID → NEW KEEPER</text>
|
|
70
|
+
<path class="edge" d="M730 488V477H1449V498"/><text class="label" x="751" y="470">YES</text>
|
|
71
|
+
</g>
|
|
72
|
+
|
|
73
|
+
<!-- Delivery loop -->
|
|
74
|
+
<g>
|
|
75
|
+
<rect x="48" y="678" width="1504" height="270" rx="24" fill="#FBFAF6" stroke="#D8D3C8"/>
|
|
76
|
+
<rect x="48" y="678" width="12" height="270" rx="6" fill="#4169E1"/>
|
|
77
|
+
<text class="eyebrow" x="86" y="711" fill="#4169E1">03 · DELIVERY LOOP</text>
|
|
78
|
+
<text class="band-title" x="86" y="740">Each Task is a restartable checkpoint, not a miniature bureaucracy.</text>
|
|
79
|
+
<g transform="translate(86 772)"><rect width="180" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/><text class="node-title" x="14" y="34">Select next Task</text><text class="body" x="14" y="55">dependencies satisfied</text><text class="body" x="14" y="72">active horizon only</text></g>
|
|
80
|
+
<g transform="translate(310 772)"><rect width="210" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/><text class="node-title" x="14" y="34">Compile exact context</text><text class="body" x="14" y="55">declared reads · constraints</text><text class="body" x="14" y="72">done conditions · evidence</text></g>
|
|
81
|
+
<g transform="translate(564 772)"><rect width="190" height="82" rx="14" fill="#FFFFFF" stroke="#C7C2B8"/><text class="node-title" x="14" y="34">Build → observe</text><text class="body" x="14" y="55">test → adjust</text><text class="body" x="14" y="72">keep local failures local</text></g>
|
|
82
|
+
<g transform="translate(798 762)"><path d="M90 0 180 51 90 102 0 51Z" fill="#FFFFFF" stroke="#4169E1" stroke-width="1.5"/><text class="node-title" x="90" y="46" text-anchor="middle">Done conditions</text><text class="body" x="90" y="65" text-anchor="middle">actually proven?</text></g>
|
|
83
|
+
<g transform="translate(1022 772)"><rect width="200" height="82" rx="14" fill="#E8ECFA" stroke="#4169E1"/><text class="node-title" x="14" y="34">Record exact evidence</text><text class="body" x="14" y="55">complete / block / reopen</text><text class="body" x="14" y="72">preserve what comes next</text></g>
|
|
84
|
+
<g transform="translate(1266 762)"><path d="M82 0 164 51 82 102 0 51Z" fill="#FFFFFF" stroke="#4169E1" stroke-width="1.5"/><text class="node-title" x="82" y="46" text-anchor="middle">More Tasks?</text><text class="body" x="82" y="65" text-anchor="middle">or new upper gap?</text></g>
|
|
85
|
+
<g transform="translate(1460 772)"><rect width="52" height="82" rx="14" fill="#17212B"/><path d="M17 41h18M28 30l11 11-11 11" fill="none" stroke="#F5F2EA" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g>
|
|
86
|
+
<path class="edge" d="M266 813H310"/><path class="edge" d="M520 813H564"/><path class="edge" d="M754 813H798"/>
|
|
87
|
+
<path class="edge" d="M978 813H1022"/><text class="label" x="986" y="801">YES</text><path class="edge" d="M1222 813H1266"/><path class="edge" d="M1430 813H1460"/><text class="label" x="1433" y="801">NO</text>
|
|
88
|
+
<path class="loop" d="M888 864V899H659V854"/><text class="label" x="716" y="917" fill="#4169E1">LOCAL NO · ITERATE</text>
|
|
89
|
+
<path class="loop" d="M1348 864V926H176V854"/><text class="label" x="672" y="940" fill="#4169E1">MORE TASKS · OR BLOCK → REPAIR UPPER SOURCE → REOPEN</text>
|
|
90
|
+
</g>
|
|
91
|
+
<text class="body" x="70" y="980">Solid line = forward handoff · Dashed cobalt = an explicit correction loop · Human interaction stays natural throughout.</text>
|
|
92
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haaaiawd/loom",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "LOOM —
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"description": "LOOM — invisible project understanding and continuity infrastructure for AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"loom": "cli/bin/loom.js"
|
|
@@ -9,35 +9,35 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"cli/bin",
|
|
11
11
|
"cli/src",
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
12
|
+
"README.md",
|
|
13
|
+
"README.zh-CN.md",
|
|
14
|
+
"CONTRIBUTING.md",
|
|
15
|
+
"SECURITY.md",
|
|
16
|
+
"design.md",
|
|
17
|
+
"EVIL_EVAL.md",
|
|
18
|
+
"docs/**/*.md",
|
|
19
|
+
"docs/**/*.svg",
|
|
20
|
+
"docs/**/*.drawio",
|
|
21
|
+
"CHANGELOG.md"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public",
|
|
25
|
+
"registry": "https://registry.npmjs.org/"
|
|
26
|
+
},
|
|
25
27
|
"engines": {
|
|
26
28
|
"node": ">=18"
|
|
27
29
|
},
|
|
28
|
-
"scripts": {
|
|
29
|
-
"test": "node cli/test/run-all.js",
|
|
30
|
-
"prepublishOnly": "npm test"
|
|
30
|
+
"scripts": {
|
|
31
|
+
"test": "node cli/test/run-all.js",
|
|
32
|
+
"prepublishOnly": "npm test"
|
|
31
33
|
},
|
|
32
34
|
"keywords": [
|
|
33
35
|
"loom",
|
|
34
36
|
"agent",
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"cli",
|
|
40
|
-
"specification-driven"
|
|
37
|
+
"continuity",
|
|
38
|
+
"project-understanding",
|
|
39
|
+
"task-context",
|
|
40
|
+
"cli"
|
|
41
41
|
],
|
|
42
42
|
"license": "MIT",
|
|
43
43
|
"repository": {
|
|
@@ -45,5 +45,8 @@
|
|
|
45
45
|
"url": "git+https://github.com/Haaaiawd/loom.git"
|
|
46
46
|
},
|
|
47
47
|
"homepage": "https://github.com/Haaaiawd/loom#readme",
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/Haaaiawd/loom/issues"
|
|
50
|
+
},
|
|
48
51
|
"author": "haaaiawd"
|
|
49
52
|
}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
# External Acquisition Gate — 来源化能力网络设计
|
|
2
|
-
|
|
3
|
-
> 状态:Implemented
|
|
4
|
-
> 目标:阻止 AI 在专业能力不足时闭门生成,并把真实外部检索编译成当前 Intent 可使用、可追溯、会随 revision 失效的核心信息组。
|
|
5
|
-
|
|
6
|
-
## 1. 问题
|
|
7
|
-
|
|
8
|
-
LOOM 已经能识别任务需要哪些能力,但“识别能力”不等于“获得能力”。如果 Forge 只根据模型已有知识临时生成一段设计原则,它仍可能做出结构正确、审美普通的结果,并把自洽误当成专业。
|
|
9
|
-
|
|
10
|
-
本设计把能力链拆成四个不同事实:
|
|
11
|
-
|
|
12
|
-
1. Capability Graph:项目为什么需要某项能力。
|
|
13
|
-
2. Search Plan:本轮要用什么问题和关键词去外部寻找。
|
|
14
|
-
3. Expertise Pack:实际打开来源后,哪些规则、工作流、判断门和失败模式可用于本 Intent。
|
|
15
|
-
4. Quality Proof:这些判断是否真的让结果胜过基线。
|
|
16
|
-
|
|
17
|
-
Graph 不保存网站、Skill 名称或固定关键词;Pack 不复制第三方 Skill 或网页正文。
|
|
18
|
-
|
|
19
|
-
## 2. 核心不变量
|
|
20
|
-
|
|
21
|
-
- AI 可以生成检索计划,不能把自己生成的内容登记为外部专业知识。
|
|
22
|
-
- `external_required` 能力必须实际使用 Skill registry、网络、官方文档或研究资料。
|
|
23
|
-
- 搜索结果标题、未打开的摘要、模型记忆和“行业通常如此”都不是来源。
|
|
24
|
-
- 每个 Capability Capsule 必须直接引用至少一个已打开、可回查的外部来源。
|
|
25
|
-
- Pack 绑定 `intent_revision`;Intent 修订后旧 Pack 自动失效。
|
|
26
|
-
- Forge 可以使用 Pack;Keeper 不继承 Forge 的结论,必须重新打开关键来源。
|
|
27
|
-
- 来源化不等于正确。CLI 证明结构与追溯,Keeper 证明来源是否真的支持判断。
|
|
28
|
-
|
|
29
|
-
## 3. 触发模型
|
|
30
|
-
|
|
31
|
-
Capability 节点可选:
|
|
32
|
-
|
|
33
|
-
```json
|
|
34
|
-
{
|
|
35
|
-
"acquisition_mode": "adaptive | external_required | project_only",
|
|
36
|
-
"acquisition_rationale": "project_only 时必填"
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
有效模式按以下顺序计算:
|
|
41
|
-
|
|
42
|
-
1. Graph 显式声明的模式优先。
|
|
43
|
-
2. 未声明时,高影响 capability 自动提升为 `external_required`。
|
|
44
|
-
3. 中低影响 capability 默认为 `adaptive`。
|
|
45
|
-
|
|
46
|
-
`project_only` 只适合未公开内部协议、纯机械迁移等外部知识不会改变做法的任务,必须说明理由。外部交付依赖与只读研究访问是两件事:允许检索资料,不等于允许把外部服务写进产品架构。
|
|
47
|
-
|
|
48
|
-
## 4. 运行流程
|
|
49
|
-
|
|
50
|
-
```text
|
|
51
|
-
Capability Graph
|
|
52
|
-
→ compile acquisition requirement
|
|
53
|
-
→ derive Search Plan from project signals
|
|
54
|
-
→ perform real external retrieval
|
|
55
|
-
→ synthesize Capability Capsules
|
|
56
|
-
→ validate Expertise Pack
|
|
57
|
-
→ Author / Atelier / implementation
|
|
58
|
-
→ independent Keeper source check
|
|
59
|
-
→ passed record binds current Pack
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
搜索词由 Forge 根据以下信号动态派生:
|
|
63
|
-
|
|
64
|
-
- capability question 与 Brief;
|
|
65
|
-
- Intent narrative、quality contract 和 creative scope;
|
|
66
|
-
- 当前媒介、宿主、技术与许可约束;
|
|
67
|
-
- 基线中已经观察到的具体缺口;
|
|
68
|
-
- Authorial Stance 尚未解决的机制问题。
|
|
69
|
-
|
|
70
|
-
关键词属于本轮工作证据,不回写 Graph。这样 LOOM 不会把“网页设计等于某几个灵感站”固化成框架偏见。
|
|
71
|
-
|
|
72
|
-
## 5. Expertise Pack
|
|
73
|
-
|
|
74
|
-
位置:
|
|
75
|
-
|
|
76
|
-
```text
|
|
77
|
-
.loom/vN/10_EXPERTISE_PACKS/<intent-id>.json
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Pack 包含:
|
|
81
|
-
|
|
82
|
-
- `search_plan`:决策问题、项目信号、派生查询、约束和停止条件;
|
|
83
|
-
- `sources`:类型、权威层级、HTTPS 定位、获取时间、选择理由和已打开证据;
|
|
84
|
-
- `capsules`:专业问题、适用时机、规则、工作流、判断门、失败模式、验证信号和来源引用;
|
|
85
|
-
- `required_capability_refs` 与 `intent_revision`;
|
|
86
|
-
- `status: draft | ready | blocked`。
|
|
87
|
-
|
|
88
|
-
Capability Capsule 是“类似 Skill 的核心信息组”,但它有三个刻意限制:
|
|
89
|
-
|
|
90
|
-
1. 只服务当前 Intent,不假装是通用知识;
|
|
91
|
-
2. 只保存项目化综合,不复制来源内容;
|
|
92
|
-
3. 未经多个真实任务和 Quality Proof 支持,不自动晋升为 Skill 或 Doctrine。
|
|
93
|
-
|
|
94
|
-
## 6. Author 与自我更正
|
|
95
|
-
|
|
96
|
-
外部获取发生在 Author/Atelier 之前。Authorial Stance 必须建立在已经来源化的机制和项目事实之上,而不是用人格、风格词或模型偏好代替研究。
|
|
97
|
-
|
|
98
|
-
自我更正分三层:
|
|
99
|
-
|
|
100
|
-
- Capsule 解释错误、来源不支持规则:修正 Pack,重新验证;如果已 passed,必须由 Keeper 重验。
|
|
101
|
-
- 当前构图、措辞、动效或候选选择失效:写入 Atelier `corrections[]`,递增 `stance_revision`。
|
|
102
|
-
- 出现新的用户结果、约束、风险或能力缺口:提交 Capability Graph proposal,由 Architect 裁决。
|
|
103
|
-
|
|
104
|
-
Author 不能修改 Graph 后继续自证,也不能用一次局部修正把任务长期知识化。
|
|
105
|
-
|
|
106
|
-
## 7. 强门与验证
|
|
107
|
-
|
|
108
|
-
以下入口共同阻止绕过:
|
|
109
|
-
|
|
110
|
-
- `loom guide`:优先引导创建或补齐 Pack;
|
|
111
|
-
- `loom activate forge --intent <id>`:Pack 未 ready 时显示 OPEN 门,只允许勘察、基线和检索;
|
|
112
|
-
- `loom expertise validate <id>`:检查 revision、真实外部来源、直接引用和 Capsule 完整性;
|
|
113
|
-
- `loom verify pass`:强门未闭合时拒绝 passed,并把当前 Pack 的内容摘要绑定到验证记录;
|
|
114
|
-
- `loom intent done`:拒绝未绑定、内容摘要变化或已经过期的 Pack;
|
|
115
|
-
- `loom doctor`:报告缺失、失效和 passed 绑定漂移;
|
|
116
|
-
- Keeper Context Pack:只给出证据入口,不注入 Forge 的 Capsule 结论。
|
|
117
|
-
|
|
118
|
-
## 8. 搜索预算与停止条件
|
|
119
|
-
|
|
120
|
-
LOOM 不规定固定网站数量,也不鼓励无限浏览。每个 Search Plan 必须写停止条件。通常在以下条件同时成立时停止:
|
|
121
|
-
|
|
122
|
-
- 每个 required capability 都有直接来源化 Capsule;
|
|
123
|
-
- 来源足以回答当前决策问题,而不只是提供视觉相似物;
|
|
124
|
-
- 已能写出可执行的判断门、失败模式和验证信号;
|
|
125
|
-
- 新来源只重复已有机制,不再改变候选或验证方法。
|
|
126
|
-
|
|
127
|
-
如果来源互相冲突、关键资料不可访问或许可不清,Pack 应进入 `blocked`,而不是让模型补齐空白。
|
|
128
|
-
|
|
129
|
-
## 9. 与现有系统的去重
|
|
130
|
-
|
|
131
|
-
- Capability Brief 负责“项目问题与获取边界”;Pack 负责“本轮实际获得了什么”。二者不重复。
|
|
132
|
-
- Authorship 负责“基于材料做什么独特选择”;Pack 负责“选择前有哪些可信材料”。二者不重复。
|
|
133
|
-
- Atelier Record 保存候选与修正;Pack 保存外部能力证据。二者不合并。
|
|
134
|
-
- Quality Proof 证明结果提升;Pack 只证明专业判断有来源。来源不能替代结果。
|
|
135
|
-
- Doctrine 保存长期项目判断;Pack 默认短命。未经重复外部结果支持,不进入 Doctrine。
|
|
136
|
-
|
|
137
|
-
## 10. 非目标
|
|
138
|
-
|
|
139
|
-
- 不在 LOOM 仓库内安装、镜像或维护第三方 Skill。
|
|
140
|
-
- 不建立固定网站白名单或 UI 专用关键词表。
|
|
141
|
-
- 不声称只要检索就能突破基础模型的所有智能边界。
|
|
142
|
-
- 不用来源数量、星标或流行度替代任务适配性。
|
|
143
|
-
- 不让 CLI 自动编造 Capsule;CLI 只建模、校验、编译和阻断。
|
package/cli/help/asset.md
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Asset Library Protocol
|
|
2
|
-
|
|
3
|
-
Asset Library is the versioned, local-first source of truth for project materials. It stores asset bytes under `.loom/vN/08_ASSET_LIBRARY/files/` and metadata in `manifest.json`. A remote URL, successful download, or HTTP 200 is never proof that an asset is renderable in the target host.
|
|
4
|
-
|
|
5
|
-
## Import
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
loom asset import ./approved-image.png \
|
|
9
|
-
--kind image \
|
|
10
|
-
--tags "庆祝,表情,项目名" \
|
|
11
|
-
--source "用户自有素材包" \
|
|
12
|
-
--author "作者或权利人" \
|
|
13
|
-
--license "授权说明或许可证" \
|
|
14
|
-
--approval approved
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Import copies an explicitly named ordinary local file, computes SHA-256, derives a stable `ASSET-...` ID, and rejects symbolic links, destination/path escape, duplicate bytes, missing provenance, and unapproved assets. It does not fetch remote material.
|
|
18
|
-
|
|
19
|
-
## Recoverable import transaction
|
|
20
|
-
|
|
21
|
-
An evidence-linked import changes three files: the copied bytes, `manifest.json`, and `07_CAPABILITY_GRAPH.json`. Filesystems do not provide one atomic operation across those files, so Loom does not claim that they do. It first prevalidates the complete candidate, then writes same-directory temporary files and a recovery journal (flushed where the filesystem supports it). If an import errors, Loom rolls back to the recorded pre-import state; if the process is interrupted, the next `loom asset validate`, import, or library read recovers the journal before using the library. `loom asset validate` reports a recovered transaction in its JSON output.
|
|
22
|
-
|
|
23
|
-
## Discover and verify
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
loom asset list
|
|
27
|
-
loom asset search 表情
|
|
28
|
-
loom asset get ASSET-<hash-prefix>
|
|
29
|
-
loom asset validate
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Tags are Unicode strings, so Chinese search works without a separate tokenizer for the small local library. Search returns only active `approval: approved` assets; `asset list` remains the audit view. Only approved assets may be used by Forge.
|
|
33
|
-
|
|
34
|
-
## Evidence links
|
|
35
|
-
|
|
36
|
-
When importing with `--evidence`, Loom validates the complete prospective manifest and Graph first, then writes both the asset's `evidence_refs` and the evidence node's `asset_refs` as one recoverable transaction. `loom asset validate` checks this reciprocal link plus hashes and provenance. This records bytes and traceability; Keeper must still check the real target host renders the result.
|
package/cli/help/atelier.md
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Atelier
|
|
2
|
-
|
|
3
|
-
Atelier 是 `quality_strategy=atelier` 的创作深路径。它让 Authorial Stance、基线、候选、
|
|
4
|
-
修正和选择证据成为单个版本化记录,不替代 Intent 状态或 Keeper。
|
|
5
|
-
|
|
6
|
-
## 何时启用
|
|
7
|
-
|
|
8
|
-
由 Architect 在 Intent 同时声明:
|
|
9
|
-
|
|
10
|
-
```json
|
|
11
|
-
{
|
|
12
|
-
"quality_contract": "相对基线可观察的质量主张与证据方式",
|
|
13
|
-
"quality_strategy": "atelier",
|
|
14
|
-
"creative_scope": "允许改变什么;必须保护什么。"
|
|
15
|
-
}
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
普通任务省略该字段或使用 `adaptive`,不会创建 Atelier Record。
|
|
19
|
-
|
|
20
|
-
## 工作流
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
loom activate forge --intent INT-001
|
|
24
|
-
loom atelier init INT-001
|
|
25
|
-
loom atelier validate INT-001
|
|
26
|
-
loom atelier get INT-001
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
记录位于 `.loom/vN/09_ATELIER/INT-001.json`,证据位于
|
|
30
|
-
`.loom/vN/09_ATELIER/files/INT-001/`。
|
|
31
|
-
|
|
32
|
-
每个候选必须绑定 `stance_revision`。Stance 改变后,旧候选要设置 `archived: true`,
|
|
33
|
-
或在重新检查后写 `requalified_for_stance_revision`。局部创作修正写入 `corrections[]`;
|
|
34
|
-
结构性新发现提交 Capability Graph proposal,由 Architect 裁决。
|
|
35
|
-
|
|
36
|
-
`loom atelier validate` 只证明记录结构、新鲜度和引用合法,不证明作品优秀。最终质量仍由
|
|
37
|
-
新的 Keeper task 依据 Quality Proof 独立判定。
|