create-egregore 0.19.5 → 0.19.7

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.
Files changed (130) hide show
  1. package/assets/egregore-launcher.js +411 -25
  2. package/bin/cli.js +34 -20
  3. package/lib/local.js +21 -5
  4. package/lib/pi-runtime.js +186 -0
  5. package/lib/setup.js +56 -11
  6. package/lib/ui.js +1 -1
  7. package/package.json +7 -5
  8. package/runtime/codex/.codex/spec-manifest.json +1 -1
  9. package/runtime/codex/AGENTS.md +7 -2
  10. package/runtime/codex/bin/codex-render-spec.mjs +6 -1
  11. package/runtime/codex/bin/codex-session-start.sh +5 -59
  12. package/runtime/codex/bin/codex-skill-render.mjs +7 -5
  13. package/runtime/codex/bin/lib/context.sh +8 -1
  14. package/runtime/codex/bin/lib/greeting.sh +12 -108
  15. package/runtime/codex/bin/lib/metrics.sh +374 -0
  16. package/runtime/codex/bin/publish-artifact.sh +14 -0
  17. package/runtime/codex/bin/settings.sh +274 -0
  18. package/runtime/codex/manifest.json +2 -0
  19. package/runtime/pi/.codex/config.toml +15 -0
  20. package/runtime/pi/.codex/hooks/branch-guard.js +242 -0
  21. package/runtime/pi/.codex/hooks/search-hint.js +65 -0
  22. package/runtime/pi/.codex/hooks.json +30 -0
  23. package/runtime/pi/.codex/skills/activity/SKILL.md +70 -0
  24. package/runtime/pi/.codex/skills/add/SKILL.md +25 -0
  25. package/runtime/pi/.codex/skills/announce/SKILL.md +54 -0
  26. package/runtime/pi/.codex/skills/answer/SKILL.md +25 -0
  27. package/runtime/pi/.codex/skills/archive/SKILL.md +41 -0
  28. package/runtime/pi/.codex/skills/ask/SKILL.md +59 -0
  29. package/runtime/pi/.codex/skills/branch/SKILL.md +25 -0
  30. package/runtime/pi/.codex/skills/checkup/SKILL.md +41 -0
  31. package/runtime/pi/.codex/skills/commit/SKILL.md +25 -0
  32. package/runtime/pi/.codex/skills/contribute/SKILL.md +25 -0
  33. package/runtime/pi/.codex/skills/dark-mode/SKILL.md +25 -0
  34. package/runtime/pi/.codex/skills/dashboard/SKILL.md +59 -0
  35. package/runtime/pi/.codex/skills/deep-reflect/SKILL.md +74 -0
  36. package/runtime/pi/.codex/skills/delete-user/SKILL.md +25 -0
  37. package/runtime/pi/.codex/skills/egregore-voice/SKILL.md +25 -0
  38. package/runtime/pi/.codex/skills/emissary/SKILL.md +41 -0
  39. package/runtime/pi/.codex/skills/env/SKILL.md +25 -0
  40. package/runtime/pi/.codex/skills/handoff/SKILL.md +67 -0
  41. package/runtime/pi/.codex/skills/harvest/SKILL.md +107 -0
  42. package/runtime/pi/.codex/skills/ingest/SKILL.md +25 -0
  43. package/runtime/pi/.codex/skills/ingest-google/SKILL.md +25 -0
  44. package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +41 -0
  45. package/runtime/pi/.codex/skills/invite/SKILL.md +40 -0
  46. package/runtime/pi/.codex/skills/issue/SKILL.md +41 -0
  47. package/runtime/pi/.codex/skills/me/SKILL.md +25 -0
  48. package/runtime/pi/.codex/skills/meeting/SKILL.md +41 -0
  49. package/runtime/pi/.codex/skills/minion/SKILL.md +25 -0
  50. package/runtime/pi/.codex/skills/note/SKILL.md +25 -0
  51. package/runtime/pi/.codex/skills/onboarding/SKILL.md +41 -0
  52. package/runtime/pi/.codex/skills/pr/SKILL.md +25 -0
  53. package/runtime/pi/.codex/skills/project/SKILL.md +41 -0
  54. package/runtime/pi/.codex/skills/pull/SKILL.md +25 -0
  55. package/runtime/pi/.codex/skills/push/SKILL.md +25 -0
  56. package/runtime/pi/.codex/skills/quest/SKILL.md +77 -0
  57. package/runtime/pi/.codex/skills/quest-suggest/SKILL.md +25 -0
  58. package/runtime/pi/.codex/skills/reflect/SKILL.md +41 -0
  59. package/runtime/pi/.codex/skills/review-pr/SKILL.md +41 -0
  60. package/runtime/pi/.codex/skills/save/SKILL.md +62 -0
  61. package/runtime/pi/.codex/skills/scroll/SKILL.md +168 -0
  62. package/runtime/pi/.codex/skills/scroll/agents/openai.yaml +4 -0
  63. package/runtime/pi/.codex/skills/scroll/assets/shell.html +542 -0
  64. package/runtime/pi/.codex/skills/search/SKILL.md +56 -0
  65. package/runtime/pi/.codex/skills/session-view/SKILL.md +25 -0
  66. package/runtime/pi/.codex/skills/setup/SKILL.md +25 -0
  67. package/runtime/pi/.codex/skills/summon/SKILL.md +41 -0
  68. package/runtime/pi/.codex/skills/sync-repos/SKILL.md +25 -0
  69. package/runtime/pi/.codex/skills/telegram-connect/SKILL.md +25 -0
  70. package/runtime/pi/.codex/skills/telemetry/SKILL.md +25 -0
  71. package/runtime/pi/.codex/skills/test/SKILL.md +41 -0
  72. package/runtime/pi/.codex/skills/the-spiral/SKILL.md +84 -0
  73. package/runtime/pi/.codex/skills/thread/SKILL.md +25 -0
  74. package/runtime/pi/.codex/skills/todo/SKILL.md +41 -0
  75. package/runtime/pi/.codex/skills/tui-design/SKILL.md +41 -0
  76. package/runtime/pi/.codex/skills/tutorial/SKILL.md +41 -0
  77. package/runtime/pi/.codex/skills/update/SKILL.md +25 -0
  78. package/runtime/pi/.codex/skills/view/SKILL.md +156 -0
  79. package/runtime/pi/.codex/skills/view/agents/openai.yaml +4 -0
  80. package/runtime/pi/.codex/skills/view/assets/compose-scaffold.html +221 -0
  81. package/runtime/pi/.codex/skills/visual-explain/SKILL.md +41 -0
  82. package/runtime/pi/.codex/skills/wrap/SKILL.md +55 -0
  83. package/runtime/pi/.codex/spec-manifest.json +114 -0
  84. package/runtime/pi/.pi/APPEND_SYSTEM.md +255 -0
  85. package/runtime/pi/.pi/extensions/egregore.ts +324 -0
  86. package/runtime/pi/.pi/settings.json +6 -0
  87. package/runtime/pi/.pi/spec-manifest.json +12 -0
  88. package/runtime/pi/AGENTS.md +350 -0
  89. package/runtime/pi/bin/activity-data.sh +242 -0
  90. package/runtime/pi/bin/agent.sh +677 -0
  91. package/runtime/pi/bin/codex-install-skills.sh +78 -0
  92. package/runtime/pi/bin/codex-render-spec.mjs +394 -0
  93. package/runtime/pi/bin/codex-session-start.sh +188 -0
  94. package/runtime/pi/bin/codex-skill-render.mjs +323 -0
  95. package/runtime/pi/bin/codex-sync-skills.sh +227 -0
  96. package/runtime/pi/bin/dashboard-data.sh +178 -0
  97. package/runtime/pi/bin/graph-batch.sh +60 -0
  98. package/runtime/pi/bin/graph-op.sh +431 -0
  99. package/runtime/pi/bin/graph-wal.sh +228 -0
  100. package/runtime/pi/bin/graph.sh +177 -0
  101. package/runtime/pi/bin/handoff-pr-backfill.sh +86 -0
  102. package/runtime/pi/bin/handoff-run.sh +581 -0
  103. package/runtime/pi/bin/handoff-save-egregore.sh +136 -0
  104. package/runtime/pi/bin/index-handoff.sh +312 -0
  105. package/runtime/pi/bin/lib/artifact-id.sh +46 -0
  106. package/runtime/pi/bin/lib/config.sh +71 -0
  107. package/runtime/pi/bin/lib/context.sh +542 -0
  108. package/runtime/pi/bin/lib/dashboard-artifact.sh +142 -0
  109. package/runtime/pi/bin/lib/ensure-develop.sh +183 -0
  110. package/runtime/pi/bin/lib/git-sync.sh +288 -0
  111. package/runtime/pi/bin/lib/greeting.sh +340 -0
  112. package/runtime/pi/bin/lib/hash.sh +13 -0
  113. package/runtime/pi/bin/lib/identity.sh +174 -0
  114. package/runtime/pi/bin/lib/metrics.sh +374 -0
  115. package/runtime/pi/bin/lib/permissions.sh +106 -0
  116. package/runtime/pi/bin/lib/time.sh +56 -0
  117. package/runtime/pi/bin/lib/worktree-links.sh +54 -0
  118. package/runtime/pi/bin/notify.sh +207 -0
  119. package/runtime/pi/bin/pi-branch-policy.mjs +15 -0
  120. package/runtime/pi/bin/pi-product-workflows.mjs +324 -0
  121. package/runtime/pi/bin/pi-render-spec.mjs +114 -0
  122. package/runtime/pi/bin/pi-session-start.sh +24 -0
  123. package/runtime/pi/bin/publish-artifact.sh +201 -0
  124. package/runtime/pi/bin/publish-references.sh +144 -0
  125. package/runtime/pi/bin/repo-state.sh +99 -0
  126. package/runtime/pi/bin/telemetry.sh +391 -0
  127. package/runtime/pi/bin/worktree-create.sh +118 -0
  128. package/runtime/pi/bin/worktree-remove.sh +50 -0
  129. package/runtime/pi/bin/worktree.sh +198 -0
  130. package/runtime/pi/manifest.json +176 -0
@@ -0,0 +1,542 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="__THEME_DARK__" data-theme-pair="__THEME_PAIR__" data-theme-mode="auto">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>__TITLE__ · Egregore</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,400..700&family=Hanken+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
10
+ <script>
11
+ /* Meridian theme engine (light / auto / dark) + palette pairs — pre-paint, no network, no permissions. */
12
+ (function(){
13
+ var PAIRS={
14
+ sovereign:{light:'ledger',dark:'bedrock'},
15
+ meridian:{light:'vellum',dark:'nocturne'},
16
+ agronomic:{light:'loam',dark:'soil'}
17
+ };
18
+ var PAIR_ORDER=['sovereign','meridian','agronomic'];
19
+ var DEFAULT_PAIR='__THEME_PAIR__';
20
+ var MODES=['light','auto','dark'], ICONS=['\u2600','\u25D0','\u263D'], LABELS=['light','auto','dark'];
21
+ function prefersDark(){
22
+ if(window.matchMedia('(prefers-color-scheme: dark)').matches) return true;
23
+ if(window.matchMedia('(prefers-color-scheme: light)').matches) return false;
24
+ var h=new Date().getHours(); return (h>=19||h<7);
25
+ }
26
+ function curPair(){ var p=null; try{p=localStorage.getItem('eg-theme-pair');}catch(e){}
27
+ return PAIRS[p]?p:DEFAULT_PAIR; }
28
+ function curMode(){ var m='auto'; try{m=localStorage.getItem('eg-theme-mode')||'auto';}catch(e){} return m; }
29
+ function apply(mode){
30
+ var pid=curPair(), pair=PAIRS[pid];
31
+ var dark=mode==='auto'?prefersDark():(mode==='dark');
32
+ var el=document.documentElement;
33
+ el.setAttribute('data-theme', dark?pair.dark:pair.light);
34
+ el.setAttribute('data-theme-pair', pid);
35
+ el.setAttribute('data-theme-mode', mode);
36
+ }
37
+ apply(curMode());
38
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change',function(){
39
+ if(curMode()==='auto') apply('auto');
40
+ });
41
+ window.__egTheme={
42
+ cycle:function(){
43
+ var next=MODES[(MODES.indexOf(curMode())+1)%3];
44
+ try{localStorage.setItem('eg-theme-mode',next);}catch(e){}
45
+ apply(next); this.paint();
46
+ },
47
+ cyclePair:function(){
48
+ var next=PAIR_ORDER[(PAIR_ORDER.indexOf(curPair())+1)%PAIR_ORDER.length];
49
+ try{localStorage.setItem('eg-theme-pair',next);}catch(e){}
50
+ apply(curMode()); this.paint();
51
+ },
52
+ paint:function(){
53
+ var i=MODES.indexOf(curMode()), b=document.getElementById('themebtn');
54
+ if(b){ b.querySelector('.ic').textContent=ICONS[i]; b.querySelector('.tl').textContent=LABELS[i]; }
55
+ var pb=document.getElementById('palbtn');
56
+ if(pb){ pb.querySelector('.tl').textContent=curPair(); }
57
+ },
58
+ init:function(){this.paint();}
59
+ };
60
+ })();
61
+ </script>
62
+ <style>
63
+ /*__MERIDIAN_CSS__*/
64
+
65
+ [data-theme="ledger"]{--sky:var(--steel)}
66
+ [data-theme="bedrock"]{--sky:var(--steel)}
67
+
68
+ /* ── Meridian compat: aliases the Threads components use, mapped to role tokens ── */
69
+ :root{
70
+ --surface:var(--card); --surface-2:var(--paper-2); --bg:var(--paper); --bg-soft:var(--paper-2);
71
+ --text-faint:var(--ink-faint); --border-soft:var(--line-soft);
72
+ --accent:var(--t1); --accent-2:var(--t1); --font:var(--sans);
73
+ --s1:var(--ink-faint); --s2:var(--sky); --s3:var(--t1); --s4:var(--t3); --s5:var(--t2);
74
+ --green:var(--t2); --red:var(--t3);
75
+ --radius:14px; --maxw:920px;
76
+ }
77
+
78
+ /* ===== Threads components (press vocabulary, re-tokenised onto Meridian) ===== */
79
+ *{box-sizing:border-box}
80
+ html{scroll-behavior:smooth}
81
+ body{margin:0;background:var(--bg);color:var(--text);font-family:var(--font);
82
+ line-height:1.62;font-size:16.5px;-webkit-font-smoothing:antialiased;}
83
+ .wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}
84
+ a{color:var(--accent);text-decoration:none}
85
+ h1,h2,h3{font-family:var(--serif);font-weight:400;line-height:1.18;letter-spacing:-.02em;color:var(--text)}
86
+ h2{font-size:1.92rem;margin:0 0 6px}
87
+ h3{font-size:1.28rem;margin:32px 0 10px}
88
+ h4{font-family:var(--serif);font-weight:400}
89
+ p{color:var(--text-dim)} p strong,li strong{color:var(--text);font-weight:600}
90
+ em{font-style:italic}
91
+ .mono{font-family:var(--mono)}
92
+ code{font-family:var(--mono);font-size:.84em;background:var(--surface-2);
93
+ border:1px solid var(--border);padding:1px 6px;border-radius:5px;color:var(--accent-2)}
94
+
95
+ /* header */
96
+ header{padding:62px 0 40px;border-bottom:1px dotted var(--line)}
97
+ .brandmark{margin-bottom:26px}
98
+ .brandmark svg{height:32px;width:auto;display:block}
99
+ .kicker{font-family:var(--mono);font-size:.72rem;letter-spacing:2.5px;text-transform:uppercase;
100
+ color:var(--accent);margin-bottom:18px}
101
+ header h1{font-size:3rem;margin:0 0 20px;max-width:20ch;line-height:1.06}
102
+ .lede{font-size:1.2rem;color:var(--text-dim);max-width:60ch;margin:0;font-family:var(--font)}
103
+ .subtitle{font-family:var(--serif);font-size:1.35rem;color:var(--text-dim);font-weight:400;
104
+ font-style:italic;margin:6px 0 0;letter-spacing:-.01em}
105
+ .meta{display:flex;gap:26px;flex-wrap:wrap;margin-top:30px;font-family:var(--mono);
106
+ font-size:.76rem;color:var(--text-faint)}
107
+ .meta b{color:var(--text-dim);font-weight:500}
108
+
109
+ /* sections + dotted divider w/ diamond */
110
+ section{padding:46px 0;border-bottom:1px dotted var(--line);position:relative}
111
+ section::after{content:"";position:absolute;left:50%;bottom:-4px;width:7px;height:7px;
112
+ transform:translateX(-50%) rotate(45deg);background:var(--bg);
113
+ border-right:1px dotted var(--line-soft);border-bottom:1px dotted var(--line-soft)}
114
+ .secnum{font-family:var(--mono);font-size:.74rem;color:var(--accent);letter-spacing:2px;margin-bottom:4px}
115
+ .lead-in{font-size:1.04rem;color:var(--text-dim);max-width:64ch}
116
+
117
+ /* summary / stat cards */
118
+ .summary{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
119
+ padding:32px 34px;margin:28px 0 8px}
120
+ .summary h3{margin-top:0}
121
+ .claims{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:24px}
122
+ .claims.three{grid-template-columns:1fr 1fr 1fr}
123
+ @media(max-width:680px){.claims,.claims.three{grid-template-columns:1fr}}
124
+ .claim{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:18px 20px}
125
+ .claim .n{font-family:var(--serif);font-size:1.62rem;color:var(--accent);font-weight:400}
126
+ .claim .l{font-size:.85rem;color:var(--text-dim);margin-top:6px;line-height:1.45}
127
+
128
+ /* callout */
129
+ .callout{border-left:2px solid var(--accent);background:var(--surface);
130
+ border-radius:0 10px 10px 0;padding:16px 22px;margin:24px 0;color:var(--text-dim)}
131
+ .callout b{color:var(--text)}
132
+
133
+ /* spectrum (progression of 2-4 options) */
134
+ .spectrum{display:grid;gap:0;margin:26px 0 10px;grid-auto-flow:column;grid-auto-columns:1fr;
135
+ border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--surface)}
136
+ @media(max-width:680px){.spectrum{grid-auto-flow:row}}
137
+ .sp{padding:22px 22px 24px;border-right:1px solid var(--border-soft);position:relative}
138
+ .sp:last-child{border-right:none}
139
+ .sp.win{background:var(--t1-bg)}
140
+ .sp .tag{font-family:var(--mono);font-size:.68rem;letter-spacing:1.2px;text-transform:uppercase;color:var(--text-faint)}
141
+ .sp.win .tag{color:var(--accent)}
142
+ .sp h4{margin:8px 0 6px;font-size:1.12rem;color:var(--text)}
143
+ .sp p{font-size:.85rem;margin:0;color:var(--text-dim)}
144
+ .sp .has{font-family:var(--mono);font-size:.72rem;margin-top:12px;color:var(--text-faint)}
145
+ .sp .has .y{color:var(--green)} .sp .has .x{color:var(--red)}
146
+
147
+ /* flow (process: node -> node -> node) */
148
+ .flow{display:flex;flex-direction:column;gap:14px;margin:26px 0 8px}
149
+ .frow{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:18px 22px}
150
+ .frow.win{border-color:var(--line-soft);background:var(--t1-bg)}
151
+ .fhead{display:flex;align-items:baseline;gap:12px;margin-bottom:14px;flex-wrap:wrap}
152
+ .fhead .cnd{font-family:var(--mono);font-weight:500;font-size:.88rem}
153
+ .fhead .gloss{color:var(--text-dim);font-size:.88rem}
154
+ .chain{display:flex;align-items:stretch;gap:0;flex-wrap:wrap}
155
+ .node{flex:1;min-width:118px;background:var(--bg);border:1px solid var(--border-soft);
156
+ border-radius:9px;padding:11px 13px}
157
+ .node .nt{font-size:.82rem;color:var(--text);font-weight:600}
158
+ .node .nd{font-size:.74rem;color:var(--text-faint);margin-top:3px;line-height:1.4}
159
+ .node.sub{border-color:var(--line-soft);background:var(--t1-bg)}
160
+ .arrow{display:flex;align-items:center;padding:0 9px;color:var(--accent);font-size:1.1rem}
161
+ .fmeta{display:flex;gap:16px;margin-top:13px;font-family:var(--mono);font-size:.72rem;color:var(--text-faint);flex-wrap:wrap}
162
+ .fmeta .y{color:var(--green)} .fmeta .x{color:var(--red)}
163
+ @media(max-width:680px){.chain{flex-direction:column}.arrow{transform:rotate(90deg);padding:4px 0;align-self:center}.node{width:100%}}
164
+
165
+ dfn{font-style:normal;color:var(--text);font-weight:600;border-bottom:1px dotted var(--accent)}
166
+
167
+ /* tables */
168
+ table{width:100%;border-collapse:collapse;margin:24px 0;font-size:.9rem}
169
+ th,td{text-align:left;padding:13px 14px;border-bottom:1px solid var(--border);vertical-align:top}
170
+ th{font-family:var(--mono);font-size:.72rem;letter-spacing:.5px;text-transform:uppercase;
171
+ color:var(--text-faint);font-weight:500}
172
+ td{color:var(--text-dim)}
173
+ tr td:first-child{color:var(--text)}
174
+ td.num,th.num{text-align:right;font-family:var(--mono);font-size:.86rem}
175
+ .tbl-overall td{border-top:2px solid var(--border);font-weight:600;color:var(--text)}
176
+ .hl{color:var(--accent);font-weight:600}
177
+ .pill{display:inline-block;font-family:var(--mono);font-size:.66rem;padding:2px 8px;border-radius:20px;
178
+ border:1px solid var(--border);background:var(--bg)}
179
+ .pill.on{color:var(--accent);border-color:var(--line-soft);background:var(--t1-bg)}
180
+
181
+ /* charts */
182
+ figure{margin:30px 0 8px;background:var(--surface);border:1px solid var(--border);
183
+ border-radius:var(--radius);padding:26px 26px 18px}
184
+ figcaption{font-size:.82rem;color:var(--text-faint);margin-top:14px;font-family:var(--mono)}
185
+ .chart-title{font-family:var(--serif);font-size:1.1rem;color:var(--text);font-weight:400;margin-bottom:2px}
186
+ .chart-sub{font-size:.82rem;color:var(--text-dim);margin-bottom:16px}
187
+ svg{display:block;width:100%;height:auto;overflow:visible;font-family:var(--font)}
188
+ svg .m{font-family:var(--mono)}
189
+ .brandmark svg{width:auto;height:32px}
190
+ .legend{display:flex;gap:20px;flex-wrap:wrap;margin-top:6px;font-size:.78rem;color:var(--text-dim);
191
+ font-family:var(--mono)}
192
+ .legend i{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:7px;vertical-align:middle}
193
+
194
+ /* horizontal bars (completeness/fidelity style) */
195
+ .barlist{margin:22px 0}
196
+ .barrow{display:grid;grid-template-columns:130px 1fr;gap:14px;align-items:center;padding:10px 0;
197
+ border-bottom:1px solid var(--border-soft)}
198
+ .barrow .lab{font-family:var(--mono);font-size:.8rem;color:var(--text-dim)}
199
+ .bars{display:flex;flex-direction:column;gap:6px}
200
+ .barline{display:flex;align-items:center;gap:10px}
201
+ .barline .t{font-family:var(--mono);font-size:.66rem;color:var(--text-faint);width:90px}
202
+ .track{flex:1;height:9px;background:var(--surface-2);border-radius:6px;overflow:hidden}
203
+ .fill{height:100%;border-radius:6px}
204
+ .barline .v{font-family:var(--mono);font-size:.72rem;color:var(--text-dim);width:34px;text-align:right}
205
+
206
+ /* numbered list (steps / findings) */
207
+ .steps{counter-reset:step;margin:22px 0}
208
+ .step{display:grid;grid-template-columns:34px 1fr;gap:16px;padding:16px 0;border-bottom:1px solid var(--border-soft)}
209
+ .step .b{counter-increment:step;font-family:var(--serif);color:var(--accent);font-size:1.2rem}
210
+ .step .b::before{content:counter(step)}
211
+ .step h4{margin:0 0 4px;font-size:1.06rem;color:var(--text)}
212
+ .step p{margin:0;font-size:.88rem}
213
+
214
+ ul,ol{color:var(--text-dim)} li{margin:5px 0}
215
+ .fin{font-size:1.04rem}
216
+ footer{padding:42px 0 70px;color:var(--text-faint);font-size:.8rem;font-family:var(--mono)}
217
+ .tag-row{display:flex;gap:10px;flex-wrap:wrap;margin-top:10px}
218
+ .tg{font-family:var(--mono);font-size:.66rem;color:var(--text-faint);border:1px solid var(--border);
219
+ border-radius:6px;padding:3px 9px;background:var(--surface)}
220
+
221
+ /* ===== Agent-handoff artifact extensions — Meridian role tokens throughout ===== */
222
+ html{scroll-behavior:smooth}
223
+ body{background:var(--paper);color:var(--ink);font-family:var(--sans);line-height:1.62;font-size:16.5px;-webkit-font-smoothing:antialiased}
224
+ .wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}
225
+ ::selection{background:var(--t1);color:var(--paper)}
226
+
227
+ .callout{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--t2);border-radius:0 12px 12px 0;padding:16px 20px;color:var(--ink-soft);font-size:.94rem}
228
+ .callout b{color:var(--ink)}
229
+
230
+ /* top bar */
231
+ .topbar{position:sticky;top:0;z-index:60;display:flex;align-items:center;gap:16px;padding:11px 22px;
232
+ background:color-mix(in srgb, var(--paper) 86%, transparent);backdrop-filter:saturate(150%) blur(10px);
233
+ border-bottom:1px solid var(--line)}
234
+ .topbar .mark{font-family:var(--mono);font-size:.74rem;letter-spacing:2px;text-transform:uppercase;color:var(--t1);font-weight:600;white-space:nowrap}
235
+ .topbar .mark .full{color:var(--ink-faint);font-weight:400}
236
+ .topbar .spacer{flex:1}
237
+ .seg{display:inline-flex;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:var(--card)}
238
+ .seg button{appearance:none;border:0;background:transparent;font-family:var(--mono);font-size:.74rem;letter-spacing:.5px;color:var(--ink-soft);padding:7px 15px;cursor:pointer;line-height:1.4}
239
+ .seg button + button{border-left:1px solid var(--line)}
240
+ .seg button.on{background:var(--t1);color:var(--paper)}
241
+ .gbtn{appearance:none;border:1px solid var(--line);background:var(--card);border-radius:9px;font-family:var(--mono);font-size:.7rem;letter-spacing:.5px;color:var(--ink-soft);padding:7px 11px;cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;gap:6px}
242
+ .gbtn .ic{font-size:.92rem;line-height:1}
243
+ @media(max-width:680px){.topbar{gap:9px;padding:9px 13px}.topbar .mark .full{display:none}.gbtn .tl{display:none}}
244
+
245
+ /* view switch */
246
+ .view{display:none}
247
+ .view.active{display:block;animation:fade .35s ease}
248
+ @keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
249
+
250
+ /* paper header */
251
+ .phead{padding:58px 0 38px;border-bottom:1px solid var(--line)}
252
+ .phead .kicker{font-family:var(--mono);font-size:.72rem;letter-spacing:2.5px;text-transform:uppercase;color:var(--t1);margin-bottom:16px}
253
+ .phead h1{font-family:var(--serif);font-weight:380;font-size:3rem;line-height:1.05;letter-spacing:-.02em;margin:0 0 16px;color:var(--ink);max-width:22ch}
254
+ .phead .subtitle{font-family:var(--serif);font-size:1.32rem;color:var(--ink-soft);font-style:italic;margin:0;letter-spacing:-.01em;max-width:54ch}
255
+ .phead .meta{display:flex;gap:24px;flex-wrap:wrap;margin-top:26px;font-family:var(--mono);font-size:.74rem;color:var(--ink-faint)}
256
+ .phead .meta b{color:var(--ink-soft);font-weight:500}
257
+ @media(max-width:620px){.phead h1{font-size:2.1rem}}
258
+
259
+ /* floating section rail — LEFT, fixed-width dot lane */
260
+ .railnav{position:fixed;top:50%;left:15px;transform:translateY(-50%);z-index:40;display:flex;flex-direction:column;gap:4px;max-height:80vh;padding:6px 2px}
261
+ .railnav a{position:relative;display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:6px}
262
+ .railnav a .rdot{width:6px;height:6px;border-radius:50%;background:var(--line);flex:none;transition:background .2s,box-shadow .2s,transform .2s}
263
+ .railnav a:hover .rdot{transform:scale(1.3);background:var(--ink-faint)}
264
+ .railnav a .rlbl{position:absolute;left:20px;top:50%;transform:translateY(-50%) translateX(-4px);opacity:0;pointer-events:none;white-space:nowrap;max-width:240px;overflow:hidden;text-overflow:ellipsis;font-family:var(--mono);font-size:.64rem;color:var(--ink-soft);background:color-mix(in srgb, var(--card) 90%, transparent);border:1px solid var(--line);border-radius:7px;padding:3px 9px;backdrop-filter:blur(6px);box-shadow:var(--shadow);transition:opacity .16s,transform .16s}
265
+ .railnav a:hover .rlbl{opacity:1;transform:translateY(-50%) translateX(0)}
266
+ .railnav a.on .rdot{background:var(--t1);box-shadow:0 0 0 3px var(--t1-bg)}
267
+ .railnav a.on .rlbl{color:var(--ink);border-color:var(--t1)}
268
+ @media(max-width:1180px){.railnav{display:none}}
269
+
270
+ /* thesis banner */
271
+ .thesis{background:var(--card);border:1px solid var(--line-soft);border-left:3px solid var(--t1);border-radius:0 14px 14px 0;padding:26px 30px;margin:30px 0 6px}
272
+ .thesis .tlab{font-family:var(--mono);font-size:.68rem;letter-spacing:2px;text-transform:uppercase;color:var(--t1);margin-bottom:12px}
273
+ .thesis blockquote{margin:0;font-family:var(--serif);font-size:1.5rem;line-height:1.32;color:var(--ink);letter-spacing:-.01em;font-weight:380}
274
+ @media(max-width:620px){.thesis blockquote{font-size:1.2rem}}
275
+
276
+ /* layer stack */
277
+ .layers{display:flex;flex-direction:column;gap:8px;margin:26px 0 10px}
278
+ .layer{display:grid;grid-template-columns:86px 190px 1fr;gap:14px;align-items:baseline;background:var(--card);border:1px solid var(--line);border-radius:11px;padding:13px 18px}
279
+ .layer .ln{font-family:var(--mono);font-size:.72rem;color:var(--t1);font-weight:600;letter-spacing:1px}
280
+ .layer .lt{font-weight:600;color:var(--ink);font-size:.95rem}
281
+ .layer .ld{color:var(--ink-soft);font-size:.9rem}
282
+ .layer.mech{border-left:3px solid var(--t2)}
283
+ .layer.policy{border-left:3px solid var(--t1)}
284
+ .layer .mechtag{font-family:var(--mono);font-size:.6rem;letter-spacing:1px;text-transform:uppercase;border-radius:20px;padding:1px 8px;margin-left:8px;vertical-align:middle}
285
+ .layer.mech .mechtag{color:var(--t2);border:1px solid var(--t2)}
286
+ .layer.policy .mechtag{color:var(--t1);border:1px solid var(--t1)}
287
+ @media(max-width:720px){.layer{grid-template-columns:1fr;gap:4px}}
288
+
289
+ /* threat cards */
290
+ .threats{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:26px 0 8px}
291
+ @media(max-width:760px){.threats{grid-template-columns:1fr}}
292
+ .tcard{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:17px 19px}
293
+ .tcard .tname{display:flex;align-items:center;gap:10px;font-weight:600;color:var(--ink);margin-bottom:7px;font-size:.96rem}
294
+ .tcard .sev{font-family:var(--mono);font-size:.6rem;letter-spacing:1.2px;text-transform:uppercase;border-radius:20px;padding:2px 9px;flex:none}
295
+ .sev.mit{color:var(--t2);border:1px solid var(--t2);background:var(--t2-bg)}
296
+ .sev.res{color:var(--t1);border:1px solid var(--t1);background:var(--t1-bg)}
297
+ .sev.open{color:var(--t3);border:1px solid var(--t3);background:transparent}
298
+ .tcard p{margin:4px 0;font-size:.88rem;line-height:1.55}
299
+ .tcard .mit-line b{color:var(--t2);font-weight:600}
300
+ .tcard .res-line b{color:var(--t3);font-weight:600}
301
+ .tcard .fork{font-family:var(--mono);font-size:.72rem;color:var(--t1);margin-top:8px}
302
+ .tcard .fork a{color:var(--t1);border-bottom:1px dotted var(--t1);text-decoration:none;cursor:pointer}
303
+
304
+ /* ===== Harvest surface ===== */
305
+ #view-harvest .wrap{max-width:960px}
306
+ .hv-hero{padding:50px 0 14px;border-bottom:1px solid var(--line)}
307
+ .hv-hero .sig{font-family:var(--mono);font-size:.72rem;letter-spacing:2.5px;text-transform:uppercase;color:var(--t1);margin-bottom:14px}
308
+ .hv-hero h1{font-family:var(--serif);font-weight:380;font-size:2.5rem;margin:0 0 14px;line-height:1.06;color:var(--ink)}
309
+ .hv-hero p{font-size:1.06rem;color:var(--ink-soft);max-width:66ch}
310
+ .hv-meta{display:flex;gap:22px;flex-wrap:wrap;margin-top:20px;font-family:var(--mono);font-size:.72rem;color:var(--ink-faint)}
311
+ .hv-meta b{color:var(--ink-soft);font-weight:500}
312
+
313
+ .band{padding:34px 0 8px}
314
+ .band > .bhead{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:4px;padding-bottom:10px;border-bottom:1px solid var(--line)}
315
+ .band > .bhead .bnum{font-family:var(--mono);font-size:.74rem;letter-spacing:2px;color:var(--t1)}
316
+ .band > .bhead h2{font-family:var(--serif);font-weight:400;font-size:1.5rem;margin:0;color:var(--ink)}
317
+ .band > .bhead .bsub{color:var(--ink-faint);font-size:.86rem;font-family:var(--mono)}
318
+
319
+ .dcard{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:24px 26px;margin:22px 0}
320
+ .dcard.answered{border-color:var(--t1);box-shadow:0 0 0 2px var(--t1-bg)}
321
+ .dhead{display:flex;align-items:baseline;gap:12px;margin-bottom:6px}
322
+ .dhead .dnum{font-family:var(--mono);font-size:.74rem;color:var(--t1);font-weight:600;flex:none;border:1px solid var(--t1);border-radius:6px;padding:1px 7px;background:var(--card)}
323
+ .dhead h3{font-family:var(--serif);font-weight:400;margin:0;font-size:1.2rem;line-height:1.25;color:var(--ink)}
324
+ .dframe{font-size:.96rem;color:var(--ink-soft);margin:6px 0 4px}
325
+ .dframe .ref{font-family:var(--mono);font-size:.78rem;color:var(--ink-faint)}
326
+
327
+ .opts{display:grid;gap:12px;margin:18px 0 6px}
328
+ .opts.two{grid-template-columns:1fr 1fr}.opts.three{grid-template-columns:1fr 1fr 1fr}
329
+ @media(max-width:720px){.opts.two,.opts.three{grid-template-columns:1fr}}
330
+ .opt{position:relative;border:1px solid var(--line);border-radius:11px;padding:15px 16px 14px;background:var(--paper);cursor:pointer;transition:.16s;display:flex;flex-direction:column;gap:10px}
331
+ .opt:hover{border-color:var(--t1);background:var(--paper-2)}
332
+ .opt.sel{border-color:var(--t1);background:var(--t1-bg);box-shadow:0 0 0 2px var(--t1)}
333
+ .opt .ohead{display:flex;align-items:center;gap:9px}
334
+ .opt .okey{font-family:var(--mono);font-size:.7rem;width:20px;height:20px;display:grid;place-items:center;border:1px solid var(--line);border-radius:5px;color:var(--ink-soft);flex:none;background:var(--card)}
335
+ .opt.sel .okey{background:var(--t1);color:var(--paper);border-color:var(--t1)}
336
+ .opt .olabel{font-weight:600;color:var(--ink);font-size:.96rem;line-height:1.25}
337
+ .oviz{font-family:var(--mono);font-size:.7rem;line-height:1.5;color:var(--ink-soft);background:var(--card);border:1px solid var(--line-soft);border-radius:8px;padding:9px 11px;white-space:pre-wrap;overflow-x:auto}
338
+ .obadges{display:flex;flex-wrap:wrap;gap:6px}
339
+ .obadges .bdg{font-family:var(--mono);font-size:.64rem;border:1px solid var(--line);border-radius:20px;padding:2px 9px;background:var(--card);color:var(--ink-soft)}
340
+ .obadges .bdg.hot{border-color:var(--t1);background:var(--card);color:var(--t1)}
341
+ .obadges .bdg.cool{border-color:var(--sky);background:var(--t2-bg);color:var(--sky)}
342
+ .otrade{display:flex;flex-direction:column;gap:3px;margin-top:2px}
343
+ .otrade span{font-size:.8rem;line-height:1.4}
344
+ .otrade .plus{color:var(--t2)}.otrade .plus::before{content:"+ ";font-family:var(--mono)}
345
+ .otrade .minus{color:var(--t3)}.otrade .minus::before{content:"\2212 ";font-family:var(--mono)}
346
+ .orec{margin-top:14px;font-size:.88rem;color:var(--ink-soft);background:var(--paper);border:1px dashed var(--t1);border-radius:9px;padding:11px 14px}
347
+ .orec b{color:var(--t1)}
348
+ .orec::before{content:"\2605 lean ";font-family:var(--mono);font-size:.72rem;letter-spacing:1px;color:var(--t1);font-weight:600}
349
+ .dnote,.otext{width:100%;margin-top:14px;font-family:var(--sans);font-size:.9rem;color:var(--ink);background:var(--paper);border:1px solid var(--line);border-radius:9px;padding:11px 13px;resize:vertical;min-height:46px;line-height:1.5}
350
+ .dnote::placeholder,.otext::placeholder{color:var(--ink-faint)}
351
+ .dnote:focus,.otext:focus,.opt:focus-visible{outline:2px solid var(--t1);outline-offset:1px}
352
+ .oprompt{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--sky);border-radius:14px;padding:22px 24px;margin:22px 0}
353
+ .oprompt .otext{min-height:80px}
354
+ .oprompt h3{font-family:var(--serif);font-weight:400;margin:0 0 8px;font-size:1.15rem;color:var(--ink)}
355
+ .oprompt p{font-size:.92rem;color:var(--ink-soft);margin:0}
356
+
357
+ .copydock{position:sticky;bottom:0;z-index:50;margin:38px 0 0;background:color-mix(in srgb, var(--paper) 92%, transparent);backdrop-filter:blur(8px);border-top:1px solid var(--line);padding:16px 0 22px}
358
+ .copydock .row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
359
+ .copydock .prog{font-family:var(--mono);font-size:.76rem;color:var(--ink-soft)}
360
+ .copydock .prog b{color:var(--t1)}
361
+ .copybtn{appearance:none;border:0;background:var(--t1);color:var(--paper);font-family:var(--mono);font-size:.78rem;letter-spacing:.5px;padding:10px 18px;border-radius:9px;cursor:pointer}
362
+ .copybtn:hover{filter:brightness(1.08)}
363
+ .copybtn.done{background:var(--t2)}
364
+ .ghostbtn{appearance:none;border:1px solid var(--line);background:var(--card);color:var(--ink-soft);font-family:var(--mono);font-size:.74rem;padding:10px 14px;border-radius:9px;cursor:pointer}
365
+ .copyblock{margin:14px 0 0;max-height:0;overflow:hidden;transition:max-height .3s ease}
366
+ .copyblock.show{max-height:520px;overflow:auto}
367
+ .copyblock pre{background:#0e151d;color:#e7ecf2;border-radius:11px;padding:16px 18px;margin:0;font-family:var(--mono);font-size:.74rem;line-height:1.6;overflow-x:auto;white-space:pre}
368
+
369
+ .pfoot{padding:42px 0 70px;color:var(--ink-faint);font-size:.8rem;font-family:var(--mono);border-top:1px solid var(--line);margin-top:10px}
370
+ .pfoot .src{margin-top:8px;line-height:1.7}
371
+ .pfoot .tag-row{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}
372
+ .pfoot .tg{font-family:var(--mono);font-size:.66rem;color:var(--ink-faint);border:1px solid var(--line);border-radius:6px;padding:3px 9px;background:var(--card)}
373
+ </style>
374
+ </head>
375
+ <body>
376
+
377
+ <nav class="topbar">
378
+ <span class="mark">⊙ EGREGORE <span class="full">· __CONTEXT__</span></span>
379
+ <span class="spacer"></span>
380
+ <span class="seg" role="tablist">
381
+ <button id="tab-paper" class="on" onclick="showView('paper')">SPEC</button>
382
+ <button id="tab-harvest" onclick="showView('harvest')">HARVEST</button>
383
+ </span>
384
+ <button id="palbtn" class="gbtn" onclick="__egTheme.cyclePair()" title="Palette: sovereign / meridian / agronomic"><span class="ic">❖</span><span class="tl">__THEME_PAIR__</span></button>
385
+ <button id="themebtn" class="gbtn" onclick="__egTheme.cycle()" title="Theme: light / auto / dark"><span class="ic">◐</span><span class="tl">auto</span></button>
386
+ </nav>
387
+
388
+ <div id="view-paper" class="view active">
389
+ <div class="wrap">
390
+ <!-- __FACE__ : replace this comment with the paper face. Required grammar:
391
+ <header class="phead"> kicker · h1 · subtitle · .meta (Author / Version vN — updates in place / Grounds / Date)
392
+ <section id="s-…"> blocks (rail-nav builds from these; h2 per section):
393
+ · the setting/question — what exists, what it cannot answer; .claims grid for load-bearing numbers; .thesis for the reframe
394
+ · the lenses — 2–4 distinct mental models of the same design (h3 each); every lens must stress-test, not decorate
395
+ · the machine — the concrete architecture; .layers for anatomy; tokenized SVG <figure> (fill/stroke ONLY var(--token)); .steps for protocol
396
+ · the consequences/product section
397
+ · honest costs — .threats grid of .tcard, each residual deep-linking <a onclick="goFork('fork-id')"> to the fork that prices it
398
+ <footer class="pfoot"> title line · .src grounds + "updates in place" note · .tag-row
399
+ -->
400
+ </div>
401
+ </div>
402
+
403
+ <div id="view-harvest" class="view">
404
+ <div class="wrap">
405
+ <!-- __HARVEST__ : replace this comment with the harvest face. Required grammar:
406
+ <div class="hv-hero"> .sig · h1 · lede naming every fork in one breath · .hv-meta (Respondent / Surface: N forks · M prompts / Loop: paste-back → vN+1 / Returns to)
407
+ <div class="callout"> how-to-read (every option carries a real + and a real −; at most one ★ lean; the why-note rides back)
408
+ <section class="band"> per band (2–4 bands), .bhead with .bnum letter:
409
+ <div class="dcard" data-decision="fork-id"> · .dhead (.dnum A1 · h3 question) · .dframe with .ref grounds
410
+ .opts.two|.three of <div class="opt" data-opt="key" data-label="Label"> · .ohead (.okey letter · .olabel) · optional .oviz (mono sketch) / .obadges · .otrade (one .plus + one .minus — an option with no minus is propaganda)
411
+ <div class="orec"> at most one ★ lean, a position not a verdict · <textarea class="dnote" data-note="fork-id">
412
+ <div class="oprompt" data-openid="prompt-id"> open prompts — ALWAYS include one meta-prompt: "this paper is alive — what should vN+1 ask?"
413
+ copydock + harvest pfoot (keep from shell)
414
+ -->
415
+
416
+ <div class="copydock">
417
+ <div class="row">
418
+ <span class="prog" id="prog"></span>
419
+ <span class="spacer" style="flex:1"></span>
420
+ <button class="ghostbtn" onclick="togglePreview()">preview block</button>
421
+ <button class="copybtn" id="copybtn" onclick="copyDecisions()">copy decisions</button>
422
+ </div>
423
+ <div class="copyblock" id="copyblock"><pre></pre></div>
424
+ </div>
425
+
426
+ <footer class="pfoot">
427
+ <div>Egregore — harvest surface for __TITLE__</div>
428
+ <div class="src">Decisions paste back into the session · absorbed through the harvest loop · the paper updates in place and v__NEXT_VERSION__'s questions regenerate · UNDECIDED stays open, never forced.</div>
429
+ <div class="tag-row"><span class="tg">__HARVEST_ID__</span><span class="tg">__SURFACE_ID__</span></div>
430
+ </footer>
431
+ </div>
432
+ </div>
433
+
434
+ <nav class="railnav" id="railnav" aria-label="Sections"></nav>
435
+
436
+ <script>
437
+ function showView(v){
438
+ document.getElementById('view-paper').classList.toggle('active', v==='paper');
439
+ document.getElementById('view-harvest').classList.toggle('active', v==='harvest');
440
+ document.getElementById('tab-paper').classList.toggle('on', v==='paper');
441
+ document.getElementById('tab-harvest').classList.toggle('on', v==='harvest');
442
+ document.getElementById('railnav').style.display = (v==='paper') ? '' : 'none';
443
+ history.replaceState(null,'', '#'+v);
444
+ window.scrollTo({top:0,behavior:'instant'});
445
+ }
446
+ function goFork(did){
447
+ showView('harvest');
448
+ var card=document.querySelector('.dcard[data-decision="'+did+'"]');
449
+ if(card){ setTimeout(function(){ card.scrollIntoView({behavior:'smooth',block:'center'}); },80); }
450
+ }
451
+ function buildRail(){
452
+ var rail=document.getElementById('railnav');
453
+ var secs=document.querySelectorAll('#view-paper section[id]');
454
+ rail.innerHTML='';
455
+ secs.forEach(function(s){
456
+ var h=(s.querySelector('h2')||{}).textContent||s.id;
457
+ var a=document.createElement('a'); a.href='#'+s.id;
458
+ a.innerHTML='<span class="rdot"></span><span class="rlbl">'+h+'</span>'; a.title=h;
459
+ rail.appendChild(a);
460
+ });
461
+ var links=[].slice.call(rail.querySelectorAll('a'));
462
+ var io=new IntersectionObserver(function(es){
463
+ es.forEach(function(e){ if(e.isIntersecting){ var id=e.target.id;
464
+ links.forEach(function(l){ l.classList.toggle('on', l.getAttribute('href')==='#'+id); }); } });
465
+ },{rootMargin:'-30% 0px -60% 0px'});
466
+ secs.forEach(function(s){io.observe(s);});
467
+ }
468
+
469
+ var SLUG='__SLUG__';
470
+ var state={decisions:{},notes:{},opens:{}};
471
+ function loadState(){ try{Object.assign(state, JSON.parse(localStorage.getItem('__STORAGE_KEY__')||'{}'));}catch(e){}
472
+ if(!state.decisions)state.decisions={}; if(!state.notes)state.notes={}; if(!state.opens)state.opens={}; }
473
+ function saveState(){ try{localStorage.setItem('__STORAGE_KEY__', JSON.stringify(state));}catch(e){} }
474
+ function wireHarvest(){
475
+ document.querySelectorAll('.dcard').forEach(function(card){
476
+ var did=card.dataset.decision;
477
+ card.querySelectorAll('.opt').forEach(function(opt){
478
+ var key=opt.dataset.opt, label=opt.dataset.label||(opt.querySelector('.olabel')||{}).textContent||key;
479
+ if(state.decisions[did] && state.decisions[did].key===key) opt.classList.add('sel');
480
+ opt.addEventListener('click', function(){
481
+ var already=opt.classList.contains('sel');
482
+ card.querySelectorAll('.opt').forEach(function(o){o.classList.remove('sel');});
483
+ if(already){delete state.decisions[did];} else {opt.classList.add('sel'); state.decisions[did]={key:key,label:label};}
484
+ card.classList.toggle('answered', !!state.decisions[did]); saveState(); updateProgress();
485
+ });
486
+ });
487
+ card.classList.toggle('answered', !!state.decisions[did]);
488
+ var nt=card.querySelector('.dnote');
489
+ if(nt){ if(state.notes[did])nt.value=state.notes[did];
490
+ nt.addEventListener('input', function(){state.notes[did]=nt.value; saveState();}); }
491
+ });
492
+ document.querySelectorAll('.oprompt .otext').forEach(function(t){
493
+ var oid=t.dataset.open;
494
+ if(state.opens[oid])t.value=state.opens[oid];
495
+ t.addEventListener('input', function(){state.opens[oid]=t.value; saveState(); updateProgress();});
496
+ });
497
+ updateProgress();
498
+ }
499
+ function buildBlock(){
500
+ var cards=[].slice.call(document.querySelectorAll('.dcard'));
501
+ var opens=[].slice.call(document.querySelectorAll('.oprompt'));
502
+ var out='#'+SLUG+'-decisions:v__VERSION__\n'
503
+ +'surface: __SURFACE_ID__\n'
504
+ +'harvest: __HARVEST_ID__\n'
505
+ +'date: __DATE__\n\n';
506
+ cards.forEach(function(c,i){ var did=c.dataset.decision, sel=state.decisions[did];
507
+ out+='Q'+(i+1)+' '+did+': '+(sel?sel.key+' ("'+sel.label+'")':'UNDECIDED')+'\n';
508
+ if(state.notes[did] && state.notes[did].trim()) out+=' note: '+state.notes[did].trim().replace(/\n+/g,' ')+'\n';
509
+ });
510
+ if(opens.length) out+='\n';
511
+ opens.forEach(function(o,i){ var oid=o.dataset.openid||(o.querySelector('.otext')||{}).dataset.open;
512
+ var ans=(state.opens[oid]||'').trim();
513
+ out+='O'+(i+1)+' '+oid+': '+(ans?ans.replace(/\n+/g,' '):'UNDECIDED')+'\n';
514
+ });
515
+ return out;
516
+ }
517
+ function updateProgress(){
518
+ var total=document.querySelectorAll('.dcard').length, done=Object.keys(state.decisions).length;
519
+ var oTotal=document.querySelectorAll('.oprompt').length, oDone=Object.values(state.opens).filter(function(v){return v&&v.trim();}).length;
520
+ var el=document.getElementById('prog'); if(el) el.innerHTML='<b>'+done+'</b>/'+total+' forks · <b>'+oDone+'</b>/'+oTotal+' prompts';
521
+ var pre=document.querySelector('#copyblock pre'); if(pre) pre.textContent=buildBlock();
522
+ }
523
+ function copyDecisions(){
524
+ var txt=buildBlock(), btn=document.getElementById('copybtn');
525
+ navigator.clipboard.writeText(txt).then(function(){
526
+ btn.textContent='✓ copied — paste into your Egregore session'; btn.classList.add('done');
527
+ setTimeout(function(){btn.textContent='copy decisions'; btn.classList.remove('done');},2600);
528
+ }).catch(function(){togglePreview(true);});
529
+ }
530
+ function togglePreview(force){
531
+ var cb=document.getElementById('copyblock');
532
+ cb.classList.toggle('show', force===true?true:!cb.classList.contains('show'));
533
+ }
534
+ (function(){
535
+ loadState();
536
+ if(window.__egTheme) __egTheme.init();
537
+ buildRail(); wireHarvest();
538
+ var h=location.hash.replace('#',''); if(h==='harvest') showView('harvest');
539
+ })();
540
+ </script>
541
+ </body>
542
+ </html>
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: search
3
+ description: Hybrid keyword + semantic recall over the org's shared memory (decisions, handoffs, quests, knowledge, meetings) when the user invokes /search or $search, or asks what the org knows/decided about a topic. Use proactively before answering questions about past work.
4
+ ---
5
+
6
+ # Egregore Search
7
+
8
+ Native Codex Egregore skill. Fully local — no API calls, works in local and
9
+ connected mode. Silence in your context does not mean silence in memory:
10
+ search before answering from conversation context alone.
11
+
12
+ ## Flow
13
+
14
+ 1. Run the search:
15
+
16
+ ```bash
17
+ bin/agent.sh search "your query" -n 6
18
+ ```
19
+
20
+ - Default is hybrid (BM25 + vector + rerank); it falls back to keyword
21
+ search automatically when local models aren't built, with a note.
22
+ - `--fast` — keyword only (BM25), instant. Use for exact terms: names,
23
+ filenames, error strings.
24
+ - `--semantic` — vector only. Use when the user's wording likely differs
25
+ from the document's.
26
+ - Graph enrichment is automatic in connected mode — hits carry `↳ graph`
27
+ state lines (status, recipient, artifact type, quest) with no flag.
28
+ `--no-enrich` skips it when speed matters; local mode never attempts it.
29
+
30
+ 2. Search the *concept*, not the user's literal sentence. If the first query
31
+ returns weak scores, run a second with different wording — one
32
+ keyword-ish, one conceptual.
33
+
34
+ 3. Results are snippets with `memory/...` file paths. Read the source file
35
+ for anything you will cite or act on — snippets truncate, and memory
36
+ files carry dates, authors, and caveats that change the answer.
37
+
38
+ 4. Answer directly, citing file paths. If results are empty or weak, say so
39
+ plainly — "nothing in memory on X" is a real answer. Do not present
40
+ conversation-context guesses as memory.
41
+
42
+ ## Routing
43
+
44
+ - Searching *code* in the repo → use your normal file search, not this.
45
+ - Relationship/status traversal in connected mode ("who claimed this
46
+ handoff?") → `bin/graph.sh`. The graph finds links between things;
47
+ search finds content inside things.
48
+
49
+ ## Maintenance
50
+
51
+ - Fully self-maintaining: every query re-indexes incrementally and warms
52
+ missing embeddings in a background job. On a fresh machine the first
53
+ searches run in keyword mode while the semantic index builds itself
54
+ (~2GB one-time local model download); no manual setup.
55
+ - `bash bin/search.sh reindex --embed` — force a full rebuild.
56
+ - `bash bin/search.sh status` — index health.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: session-view
3
+ description: 'Turn the current working session into an expressive, self-contained HTML view of how it evolved — steady work as a quiet spine, decisions as forks showing the road taken beside the roads not taken. Use for "/session-view", "make sense of this session", "turn this session into an artifact", "show how this session evolved".'
4
+ ---
5
+
6
+ <!-- generated-by: bin/codex-sync-skills.sh -->
7
+
8
+ # Egregore session-view Adapter
9
+
10
+ This is fallback coverage for a long-tail Egregore workflow that has not been
11
+ ported to a hand-written Codex-native skill yet.
12
+
13
+ Use the project shell and filesystem directly. Do not invoke Claude Code
14
+ commands. Translate interactive choices to structured Codex question tooling
15
+ when it is available; otherwise render compact numbered choices with an
16
+ `Other:` option and wait for the user.
17
+
18
+ 1. Read `.claude/skills/session-view/SKILL.md` for the workflow details.
19
+ 2. Run the referenced `bin/` scripts directly from Codex.
20
+ 3. Treat graph, publish, and notify steps as best-effort unless that workflow
21
+ explicitly says they are required.
22
+ 4. Keep local-mode behavior filesystem-first and avoid graph or notification
23
+ calls when `egregore.json` declares `"mode": "local"`.
24
+ 5. Never call the deprecated `egregore-handoff` CLI for Egregore project
25
+ handoffs.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: setup
3
+ description: 'Fallback Codex adapter for the Egregore setup workflow.'
4
+ ---
5
+
6
+ <!-- generated-by: bin/codex-sync-skills.sh -->
7
+
8
+ # Egregore setup Adapter
9
+
10
+ This is fallback coverage for a long-tail Egregore workflow that has not been
11
+ ported to a hand-written Codex-native skill yet.
12
+
13
+ Use the project shell and filesystem directly. Do not invoke Claude Code
14
+ commands. Translate interactive choices to structured Codex question tooling
15
+ when it is available; otherwise render compact numbered choices with an
16
+ `Other:` option and wait for the user.
17
+
18
+ 1. Read `.claude/skills/setup/SKILL.md` for the workflow details.
19
+ 2. Run the referenced `bin/` scripts directly from Codex.
20
+ 3. Treat graph, publish, and notify steps as best-effort unless that workflow
21
+ explicitly says they are required.
22
+ 4. Keep local-mode behavior filesystem-first and avoid graph or notification
23
+ calls when `egregore.json` declares `"mode": "local"`.
24
+ 5. Never call the deprecated `egregore-handoff` CLI for Egregore project
25
+ handoffs.