Repository navigation
Expand file tree
/
Copy pathcgo.html
More file actions
728 lines (679 loc) · 91.7 KB
/
Copy pathcgo.html
File metadata and controls
728 lines (679 loc) · 91.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>CGO — Farm Hack Box</title>
<meta name="description" content="Community Governed Organizations: roles, protocols, tools and ceremonies — and what a Farm Hack Box actually holds for each.">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='.9em' font-size='90'%3E🌾%3C/text%3E%3C/svg%3E">
<link rel="stylesheet" href="assets/peek.css">
<link rel="stylesheet" href="assets/app.css">
<script src="assets/peek.js" defer></script>
<style>
/* ─────────────────────────────────────────────────────────────────────────────
CGO surface — a Governance-section sibling to /admin/#/agroecology, laid out
as the printed card unfolded: the front (headline, tagline, hero art), the
back (four blocks, each a bold statement over a one-line explanation), the
Reflections box, and then — below the fold the card cannot have — what this
box actually holds for each element.
WHAT IS BORROWED FROM THE CARD, and what deliberately is not.
Borrowed: the earth-tone palette, teal for headers, rounded-corner bordered
boxes, the statement-over-explanation pattern from the reference card's back,
the boxed Reflections panel, and the generous white space that makes the
reference read as an invitation rather than a poster.
NOT borrowed: the iconography. The river, corn, pottery and hummingbird on the
reference pieces are hand-drawn Indigenous artwork by a named artist. Imitating
that style in CSS would be taking the look without the hand or the permission,
so the illustration areas here are marked slots, sized and placed where the art
belongs, and the only ornament this page draws for itself is a four-colour band
that is simply the four elements' own key.
Type is the canon shelf's serif stack — locally available faces, no web font —
because the box is offline-first and a page that needs Google Fonts to look
right is a page that looks wrong in a barn.
───────────────────────────────────────────────────────────────────────────── */
.cgo{
--paper:#FAF5EA; --paper-2:#F2E9D8; --card:#FFFDF8;
--ink:#241F1A; --ink-soft:#5A5148; --ink-faint:#8B8175;
--rule:#DCD0BA;
--teal:#14614C; --teal-bright:#1D9E75;
--clay:#B5623C; --corn:#CE9A2E; --sage:#6F8F5B; --river:#3C7A9E;
--serif:"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,serif;
background:var(--paper);color:var(--ink);
}
body:has(.cgo){background:var(--paper,#FAF5EA)}
.cgo a{color:inherit}
.cgo .lnk{color:var(--teal)}
.cgo .t-title,.cgo .t-body,.cgo .t-faint{color:inherit}
/* ── the card, front ── */
.front{background:var(--card);border:1px solid var(--rule);border-radius:14px;padding:32px 30px;position:relative;overflow:hidden}
.front .eyebrow{font:700 11px/1 ui-monospace,Menlo,monospace;letter-spacing:.22em;text-transform:uppercase;color:var(--teal)}
.front h1{font-family:var(--serif);font-weight:600;font-size:clamp(28px,5vw,46px);line-height:1.02;letter-spacing:-.015em;margin:10px 0 0;max-width:15ch}
.front .tagline{font-family:var(--serif);font-style:italic;font-size:clamp(16px,2.4vw,21px);color:var(--teal);margin-top:14px}
.front .lede{font-size:15px;line-height:1.7;color:var(--ink-soft);max-width:56ch;margin-top:16px}
.front .go{margin-top:18px;display:flex;flex-wrap:wrap;gap:10px}
.front .go a{font-size:13px;font-weight:600;text-decoration:none;color:var(--teal);border:1px solid var(--rule);
background:var(--paper);border-radius:999px;padding:9px 16px}
.front .go a:hover{border-color:var(--teal);background:#fff}
.frontgrid{display:grid;grid-template-columns:1fr 280px;gap:28px;align-items:center}
@media(max-width:820px){.frontgrid{grid-template-columns:1fr}}
/* the four-colour band: the elements' own key, and the page's only ornament */
.band{display:flex;height:8px;border-radius:999px;overflow:hidden;margin-bottom:22px}
.band i{flex:1}
/* artwork — the group's own card pieces, shown whole rather than cropped */
.art{margin:0}
.art img{display:block;width:100%;height:auto;border-radius:12px;border:1px solid var(--rule);
box-shadow:0 10px 30px rgba(36,31,26,.12);cursor:zoom-in;background:var(--card)}
.art img:hover{border-color:var(--teal)}
.art figcaption{margin-top:10px;font-size:12px;line-height:1.55;color:var(--ink-faint);max-width:40ch}
.art figcaption b{display:block;color:var(--ink-soft);font-weight:600}
.cardpair{display:grid;grid-template-columns:1fr 300px;gap:24px;align-items:start}
@media(max-width:900px){.cardpair{grid-template-columns:1fr}.cardpair .art{max-width:420px}}
/* artwork slots — kept for art that does not exist yet */
.artslot{border:1.5px dashed var(--rule);border-radius:12px;background:
repeating-linear-gradient(135deg,transparent,transparent 9px,rgba(220,208,186,.28) 9px,rgba(220,208,186,.28) 18px);
min-height:190px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:18px;text-align:center}
.artslot .k{font:700 9.5px/1 ui-monospace,Menlo,monospace;letter-spacing:.16em;text-transform:uppercase;color:var(--teal)}
.artslot .t{font-size:12px;color:var(--ink-faint);max-width:26ch;line-height:1.5}
/* ── the card, back: four blocks ── */
.blocks{display:grid;gap:14px;grid-template-columns:1fr}
@media(min-width:820px){.blocks{grid-template-columns:1fr 1fr}} /* 2×2 — the back of the card, four blocks */
.q-card{display:block;background:var(--card);border:1.5px solid var(--rule);border-left:5px solid var(--acc);
border-radius:12px;padding:20px 22px;text-decoration:none;transition:border-color .15s,box-shadow .15s,transform .15s}
.q-card:hover,.q-card:focus-visible{border-color:var(--acc);box-shadow:0 8px 22px rgba(36,31,26,.08);transform:translateY(-2px);outline:none}
.q-card .top{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.q-card h3{font-family:var(--serif);font-size:21px;font-weight:600;color:var(--acc);letter-spacing:-.01em}
.q-card .n{font:700 10px/1 ui-monospace,Menlo,monospace;color:var(--ink-faint);letter-spacing:.1em}
.q-card .statement{font-family:var(--serif);font-weight:600;font-size:17px;line-height:1.3;margin-top:12px;color:var(--ink)}
.q-card .line{font-size:13.5px;line-height:1.6;color:var(--ink-soft);margin-top:6px}
.q-card .quote{font-size:12.5px;line-height:1.6;color:var(--ink-faint);margin-top:12px;padding-top:12px;border-top:1px solid var(--rule)}
.q-card .holds{display:flex;align-items:baseline;gap:8px;margin-top:14px}
.q-card .holds b{font-family:var(--serif);font-size:24px;font-weight:600;color:var(--acc);line-height:1}
.q-card .holds span{font:600 9.5px/1.3 ui-monospace,Menlo,monospace;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-faint)}
.cgo .spheres{gap:5px;margin-top:12px}
.cgo .sph{font-size:10.5px;padding:3px 8px;border-radius:999px;border:1px solid var(--rule);background:var(--paper);color:var(--ink-soft)}
.cgo .sph.has{background:rgba(20,97,76,.07);border-color:rgba(20,97,76,.25);color:var(--teal)}
.cgo .sph.none{background:rgba(206,154,46,.12);border-color:rgba(206,154,46,.4);color:#8a6914}
/* ── Reflections, the card's own panel ── */
.reflectbox{border:2.5px solid var(--ink);border-radius:14px;padding:24px 26px 26px;background:var(--card);position:relative}
.reflectbox h2{font-family:var(--serif);font-size:20px;font-weight:600;color:var(--teal);text-align:center;display:flex;
align-items:center;justify-content:center;gap:12px}
.reflectbox h2 i{display:block;width:26px;height:2px;background:var(--teal);opacity:.55}
.reflectbox ol{margin:18px 0 0;padding-left:22px}
.reflectbox li{font-size:14.5px;color:var(--ink);line-height:1.75;margin-top:14px;max-width:70ch}
.reflectbox .hint{margin-top:18px;font-size:12px;color:var(--ink-faint);text-align:center;font-style:italic}
/* ── footer strip, where the card carries logos and a QR ── */
.cardfoot{display:grid;grid-template-columns:1fr auto;gap:20px;align-items:center;
border-top:1px solid var(--rule);padding-top:18px;margin-top:4px}
@media(max-width:620px){.cardfoot{grid-template-columns:1fr}}
.cardfoot p{font-size:12.5px;color:var(--ink-faint);line-height:1.6;max-width:62ch}
.qrslot{width:96px;height:96px;border:1.5px dashed var(--rule);border-radius:10px;display:flex;align-items:center;
justify-content:center;font:700 9px/1.3 ui-monospace,Menlo,monospace;letter-spacing:.1em;color:var(--ink-faint);text-align:center}
/* ── element page, in the same hand ── */
.cgo .card,.cgo .pit,.cgo .weak,.cgo table.mx{background:var(--card)}
.cgo .card{border-color:var(--rule)}
.cgo .el-head h1{font-family:var(--serif);font-size:30px;font-weight:600;color:var(--acc);letter-spacing:-.015em}
.cgo .el-statement{font-family:var(--serif);font-size:20px;font-weight:600;line-height:1.35;margin-top:10px;max-width:34ch}
.cgo .el-line{font-size:14px;color:var(--ink-soft);margin-top:8px;line-height:1.65;max-width:62ch}
.cgo .quotedef{font-size:14px;color:var(--ink-soft);line-height:1.7;margin-top:16px;padding-left:14px;border-left:3px solid var(--acc);max-width:66ch}
.cgo .reflect{border-color:var(--acc)}
.cgo .reflect p{color:var(--ink);font-family:var(--serif);font-size:16px}
.cgo .sect-head{border-bottom-color:var(--rule)}
.cgo .sect-head h2{font-family:var(--serif);font-size:18px;font-weight:600}
.cgo .divide>*+*{border-top-color:var(--rule)}
.cgo .nm{font-weight:600}
.cgo .li{color:var(--ink-faint)}
.cgo .weak{border-color:rgba(181,98,60,.45);background:rgba(181,98,60,.06)}
.cgo .weak h2{font-family:var(--serif);font-size:18px;color:var(--clay)}
.cgo .weak p{color:var(--ink-soft);font-size:13.5px;line-height:1.7}
.cgo .grp-head h2{font-family:var(--serif);font-size:20px;font-weight:600}
.cgo .crumb a,.cgo .pager a{color:var(--ink-soft)}
.dot.absent{background:transparent!important;border:1px solid var(--rule)}
.medallion{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;border-radius:50%;
border:1.5px solid currentColor;background:var(--card);font-family:var(--serif);font-weight:600;line-height:1}
/* ── matrix, same palette ── */
.cgo table.mx thead th{border-bottom:1px solid var(--rule)}
.cgo .mx tbody tr.el{border-top-color:var(--rule)}
.cgo .mx tbody tr.el:hover td,.cgo .mx tbody tr.el:hover th{background:var(--paper)}
.cgo .mx .sticky{background:var(--card)}
.cgo .hub{font-family:var(--serif);font-size:15px;font-weight:600;color:var(--ink)}
.cgo .regime{font:600 9.5px/1.3 ui-monospace,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);margin-top:2px}
.cgo .mx .rt{font-family:var(--serif);font-size:16px;font-weight:600;color:var(--acc)}
.cgo .cellv{font-size:13px;color:var(--ink-soft)}
.cgo .appbar{background:var(--card);border-bottom-color:var(--rule)}
.cgo .appbar .tabs a{border-color:var(--rule);background:var(--paper);color:var(--ink-soft)}
.cgo .appbar .tabs a[aria-current]{background:var(--teal);border-color:var(--teal);color:#fff}
.cgo .appbar .crumbs b{color:var(--ink)}
.cgo .appbar .tabs{flex-wrap:wrap}
/* ─────────────────────────────────────────────────────────────────────────────
THE TOOLKIT (2026-09-28): the four scales, the Steward's Agreement, the
maturity plan and the open questions. Words from farmhack/governance, numbers
from this box's database — see cgo_toolkit.py. Same paper, same hand.
───────────────────────────────────────────────────────────────────────────── */
.cgo code{font:12px/1.4 ui-monospace,Menlo,monospace;background:var(--paper-2);padding:1px 5px;border-radius:4px;overflow-wrap:anywhere}
.provenance{font-size:12px;line-height:1.6;color:var(--ink-faint)}
.provenance b{color:var(--ink-soft);font-weight:600}
.pill{display:inline-flex;align-items:center;gap:6px;font:600 10px/1 ui-monospace,Menlo,monospace;letter-spacing:.08em;
text-transform:uppercase;padding:5px 9px;border-radius:999px;border:1px solid var(--rule);background:var(--paper);color:var(--ink-soft);white-space:nowrap}
.pill.open{background:rgba(206,154,46,.12);border-color:rgba(206,154,46,.45);color:#7d5f12}
.pill.no{background:rgba(181,98,60,.08);border-color:rgba(181,98,60,.4);color:var(--clay)}
.pill.yes{background:rgba(20,97,76,.08);border-color:rgba(20,97,76,.3);color:var(--teal)}
.lede2{font-size:14.5px;line-height:1.7;color:var(--ink-soft);max-width:66ch}
.h-serif{font-family:var(--serif);font-weight:600;letter-spacing:-.01em}
/* toolkit doors on the front page */
.doors{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}
.door{display:block;text-decoration:none;background:var(--card);border:1.5px solid var(--rule);border-radius:12px;padding:16px 18px;
transition:border-color .15s,transform .15s}
.door:hover,.door:focus-visible{border-color:var(--teal);transform:translateY(-2px);outline:none}
.door .k{font:700 9.5px/1 ui-monospace,Menlo,monospace;letter-spacing:.16em;text-transform:uppercase;color:var(--teal)}
.door h3{font-family:var(--serif);font-size:18px;font-weight:600;margin-top:8px}
.door p{font-size:13px;line-height:1.6;color:var(--ink-soft);margin-top:6px}
.door .foot{margin-top:10px;display:flex;flex-wrap:wrap;gap:6px}
/* named gaps */
.gaps{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
.gap{border:1.5px dashed rgba(181,98,60,.45);border-radius:10px;padding:12px 14px;background:rgba(181,98,60,.04)}
.gap.built{border-style:solid;border-color:rgba(20,97,76,.35);background:rgba(20,97,76,.05)}
.gap code{background:transparent;padding:0;color:var(--ink);font-weight:600}
.gap p{font-size:12.5px;line-height:1.55;color:var(--ink-soft);margin-top:6px}
/* the 4 × 4 frame */
.frame{display:grid;grid-template-columns:150px repeat(4,minmax(0,1fr));gap:6px}
.frame .ch{border-radius:10px 10px 0 0;padding:12px 12px 10px;border-top:5px solid var(--acc);background:var(--card)}
.frame .ch b{font-family:var(--serif);font-size:17px;font-weight:600;color:var(--acc);display:block}
.frame .ch i{font-family:var(--serif);font-size:13px;color:var(--ink-soft);display:block;margin-top:4px;line-height:1.35}
.frame .rh{padding:12px;border-radius:10px 0 0 10px;background:var(--paper-2)}
.frame .rh b{font-family:var(--serif);font-size:16px;font-weight:600;display:block}
.frame .rh span{font-size:11.5px;color:var(--ink-faint);line-height:1.45;display:block;margin-top:4px}
.frame .cell{background:var(--card);border:1px solid var(--rule);border-radius:8px;padding:11px 12px;font-size:13px;line-height:1.55;color:var(--ink-soft)}
.frame .cell b{color:var(--ink);font-weight:600}
.frame .node .cell{border-color:var(--teal);box-shadow:inset 0 0 0 1px rgba(20,97,76,.15)}
.frame .node.rh{background:rgba(20,97,76,.1)}
.frame .corner{background:transparent}
.frame .row{display:contents}
.frame .cell .ek{display:none}
@media(max-width:900px){
.frame{grid-template-columns:1fr}
.frame .ch,.frame .corner{display:none}
.frame .rh{border-radius:10px;margin-top:14px}
.frame .cell .ek{display:block;font:700 9.5px/1 ui-monospace,Menlo,monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--acc);margin-bottom:6px}
.frame .cell{border-left:4px solid var(--acc)}
}
.colstrip{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.colstrip .cell{background:var(--card);border:1px solid var(--rule);border-top:3px solid var(--acc);border-radius:8px;padding:11px 12px;font-size:13px;line-height:1.55;color:var(--ink-soft)}
.colstrip .cell .sc{font:700 9.5px/1 ui-monospace,Menlo,monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);display:block;margin-bottom:6px}
/* the Agreement */
.agr-head{display:grid;grid-template-columns:1fr 260px;gap:26px;align-items:start}
@media(max-width:860px){.agr-head{grid-template-columns:1fr}.agr-head .art{max-width:360px}}
.status{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));margin-top:18px}
.status>div{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:10px 12px}
.status .k{font:700 9.5px/1.2 ui-monospace,Menlo,monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint)}
.status .v{font-family:var(--serif);font-size:16px;font-weight:600;margin-top:6px}
.status .s{font-size:12px;color:var(--ink-soft);line-height:1.5;margin-top:4px}
.zine{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(270px,1fr))}
.panel{background:var(--card);border:1.5px solid var(--rule);border-radius:12px;padding:18px 20px}
.panel h3{font:700 11px/1.2 ui-monospace,Menlo,monospace;letter-spacing:.16em;text-transform:uppercase;color:var(--acc,var(--teal))}
.panel ul{list-style:none;margin:12px 0 0;padding:0}
.panel li{font-size:13.5px;line-height:1.55;color:var(--ink-soft);padding:7px 0;border-top:1px solid var(--rule)}
.panel li:first-child{border-top:0}
.panel li b{display:block;font-family:var(--serif);font-size:15px;color:var(--ink);font-weight:600}
.panel li.x::before{content:"✕ ";color:var(--clay);font-weight:700}
.mantra{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.mantra span{font:700 11px/1 ui-monospace,Menlo,monospace;letter-spacing:.1em;color:var(--teal);border:1.5px solid rgba(20,97,76,.35);border-radius:999px;padding:7px 11px}
.aside{border-left:3px solid var(--acc,var(--teal));padding:4px 0 4px 14px;margin-top:12px}
.aside b{font:700 10px/1.2 ui-monospace,Menlo,monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);display:block}
.aside p{font-family:var(--serif);font-size:14.5px;line-height:1.5;color:var(--ink);margin-top:4px}
.steps{counter-reset:s;list-style:none;margin:0;padding:0}
.steps>li{counter-increment:s;position:relative;padding:12px 0 12px 44px;border-top:1px solid var(--rule);font-size:14px;line-height:1.65;color:var(--ink-soft)}
.steps>li:first-child{border-top:0}
.steps>li::before{content:counter(s);position:absolute;left:0;top:12px;width:28px;height:28px;border-radius:50%;
border:1.5px solid var(--teal);color:var(--teal);font:600 14px/26px var(--serif);text-align:center}
.steps>li b{color:var(--ink)}
.steps ul{margin:6px 0 0 18px;padding:0}
.steps ul li{margin-top:4px}
/* the maturity plan */
.ladder{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px}
@media(max-width:820px){.ladder{grid-template-columns:1fr}}
.rung{background:var(--card);border:1px solid var(--rule);border-radius:10px;padding:12px;border-top:4px solid var(--stg)}
.rung .n{font:700 10px/1 ui-monospace,Menlo,monospace;letter-spacing:.12em;color:var(--stg)}
.rung b{font-family:var(--serif);font-size:16px;font-weight:600;display:block;margin-top:6px}
.rung p{font-size:12.5px;line-height:1.55;color:var(--ink-soft);margin-top:6px}
.rung p.lg{color:var(--ink-faint);font-size:12px;border-top:1px dashed var(--rule);padding-top:6px}
.power{background:var(--card);border:1px solid var(--rule);border-radius:12px;padding:16px 18px}
.power+.power{margin-top:10px}
.power .top{display:flex;gap:12px;align-items:baseline;flex-wrap:wrap}
.power .id{font:700 11px/1 ui-monospace,Menlo,monospace;color:var(--ink-faint)}
.power h3{font-family:var(--serif);font-size:16.5px;font-weight:600;flex:1;min-width:220px;line-height:1.35}
.power .who{font-size:12.5px;color:var(--ink-soft);margin-top:4px}
.track{display:flex;gap:3px;margin-top:12px;align-items:center}
.track i{flex:1;height:7px;border-radius:999px;background:var(--paper-2);position:relative}
.track i.on{background:var(--stg)}
.track i.here::after{content:"";position:absolute;right:-2px;top:-4px;width:15px;height:15px;border-radius:50%;background:var(--card);border:3px solid var(--stg)}
.tracklbl{display:flex;justify-content:space-between;font:600 9px/1 ui-monospace,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint);margin-top:6px}
.power .cols{display:grid;grid-template-columns:1.4fr 1fr;gap:14px;margin-top:12px}
@media(max-width:720px){.power .cols{grid-template-columns:1fr}}
.power .cols .k{font:700 9.5px/1.2 ui-monospace,Menlo,monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint)}
.power .cols p{font-size:13px;line-height:1.6;color:var(--ink-soft);margin-top:4px}
.power .meta{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.defects{border:1.5px solid rgba(181,98,60,.45);background:rgba(181,98,60,.05);border-radius:12px;padding:18px 20px}
.defects h2{font-family:var(--serif);font-size:18px;color:var(--clay);font-weight:600}
.defects .d{padding:10px 0;border-top:1px solid rgba(181,98,60,.25);font-size:13px;line-height:1.6;color:var(--ink-soft)}
.defects .d:first-of-type{border-top:0}
.defects .d b.t{color:var(--ink);font-family:var(--serif);font-size:15px;display:block}
.guards{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}
.guards div{background:var(--card);border:1px solid var(--rule);border-radius:10px;padding:13px 15px}
.guards b{font-family:var(--serif);font-size:15px;font-weight:600;display:block}
.guards p{font-size:12.5px;line-height:1.6;color:var(--ink-soft);margin-top:5px}
.mil{display:grid;grid-template-columns:200px 1fr;gap:0}
.mil>div{padding:10px 12px;border-top:1px solid var(--rule);font-size:13px;line-height:1.6;color:var(--ink-soft)}
.mil>div:nth-child(odd){font-family:var(--serif);font-weight:600;color:var(--ink)}
@media(max-width:620px){.mil{grid-template-columns:1fr}.mil>div:nth-child(even){border-top:0;padding-top:0}}
/* open questions */
.qgroup+.qgroup{margin-top:28px}
.qs{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-top:12px}
.oq{background:var(--card);border:1.5px solid var(--rule);border-radius:12px;padding:15px 17px;display:flex;flex-direction:column;gap:10px}
.oq:target{border-color:var(--corn);box-shadow:0 0 0 3px rgba(206,154,46,.2)}
.oq .top{display:flex;justify-content:space-between;align-items:center;gap:10px}
.oq .id{font:700 12px/1 ui-monospace,Menlo,monospace;color:var(--ink-faint)}
.oq .q{font-family:var(--serif);font-size:15.5px;font-weight:600;line-height:1.4;color:var(--ink)}
.oq .k{font:700 9.5px/1.2 ui-monospace,Menlo,monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint)}
.oq .v{font-size:13px;line-height:1.55;color:var(--ink-soft);margin-top:3px}
.qref{text-decoration:none;border-bottom:1px dotted var(--corn);color:#7d5f12;font-weight:600}
</style>
</head>
<body data-peek="cgo" class="cgo">
<svg width="0" height="0" style="position:absolute" aria-hidden="true"><defs><symbol id="r-i-role-capture" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v9"/><path d="M8.5 8.5L12 12l3.5-3.5"/><path d="M4 14v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4"/></symbol>
<symbol id="r-i-role-analyse" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M5 20v-5"/><path d="M9.5 20v-8"/><path d="M14 20v-3"/><circle cx="15.5" cy="8.5" r="4.5"/><path d="M18.8 11.8L22 15"/></symbol>
<symbol id="r-i-role-interpret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 17a9 9 0 1 1 17 0"/><path d="M12 17l4.2-5"/><circle cx="12" cy="17" r="1.4"/></symbol>
<symbol id="r-i-role-govern" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3h8l4 4v8"/><path d="M6 3v18h5"/><path d="M14 3v4h4"/><circle cx="17" cy="18" r="3.2"/><path d="M17 15.6v2.4l1.6 1"/></symbol>
<symbol id="r-i-role-exchange" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 9h13"/><path d="M13.5 5.5L17 9l-3.5 3.5"/><path d="M20 15H7"/><path d="M10.5 11.5L7 15l3.5 3.5"/></symbol>
<symbol id="r-i-book" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></symbol></defs></svg>
<header class="appbar">
<div class="appbar-inner">
<nav class="crumbs" aria-label="Breadcrumb">
<a href="/admin">Box admin</a><span>›</span><a href="/admin/#/governance">Governance</a><span>›</span><span id="crumb"><b>CGO</b></span>
</nav>
<div class="tabs" id="tabs">
<a href="#/" data-v="list">The card</a>
<a href="#/scales" data-v="scales">Four scales</a>
<a href="#/agreement" data-v="agreement">Steward’s Agreement</a>
<a href="#/maturity" data-v="maturity">Maturity</a>
<a href="#/questions" data-v="questions">Open questions</a>
<a href="#/matrix" data-v="matrix">By hub</a>
</div>
</div>
</header>
<main id="view" aria-live="polite"></main>
<script>window.CGO = {"_authored": "Prototype data for a CGO surface. The four element definitions are quoted from the CGO Collateral Card creative brief (CGO / DWeb, front-and-back card, 2026-07-05). Every number in double braces is filled at build time from src/cgo-queries.yaml, run against the box's own database; the words are authored here, the numbers never are.", "attribution": {"source_label": "CGO Collateral Card — creative brief", "byline": "CGO / DWeb · card front-and-back · four elements", "tagline": "The community is the way.", "naming_note": "The card expands CGO as Community Governed Organizations. The Cohort-2 hardware concept note calls the same group Community Governance of Open Knowledge, and this box's ground profile said Commons Governance Organization. Three expansions, one acronym — the card's is used here.", "art_note": "The artwork is Jenni's, created for the CGO card and used here as intended. This page takes its palette and its statement-over-explanation pattern from the same piece."}, "regimes": {"owner": "Owner-held", "research": "Research consent", "governance": "Governance testimony", "education": "Education records", "public": "Public reference", "administrative": "Administrative"}, "hubs": [{"id": "farmer", "label": "Farmer", "regime": "owner", "roles": 5, "cards": 36}, {"id": "science", "label": "Science", "regime": "research", "roles": 4, "cards": 12}, {"id": "commons", "label": "Commons", "regime": "public", "roles": 6, "cards": 23}, {"id": "district", "label": "District", "regime": "governance", "roles": 1, "cards": 1}, {"id": "school", "label": "School", "regime": "education", "roles": 2, "cards": 26}, {"id": "box-admin", "label": "Box Admin", "regime": "administrative", "roles": 0, "cards": 11}], "elements": [{"n": 1, "key": "roles", "title": "Roles", "statement": "Say who decides, out loud.", "line": "Responsibility that is never named lands on whoever is nearest — and cannot be handed on.", "icon": "fi:fair-labor", "essence": "The defined responsibilities and decision making authority each community member holds within the CGO's governance structure.", "practice": "On a box, a role is not a job title — it is what the software will and will not let a person see and do, in every app at once. The box keeps one vocabulary and maps it outward to farmOS, LiteFarm, the POS and the rest.", "reflect": "Who here can say no, and to whom? Name the person, not the position.", "count": 12, "count_label": "roles defined", "components": [{"id": "roles", "title": "Role vocabulary", "state": "live", "detail": "12 roles, each mapping to a farmOS, LiteFarm, POS, grazing and CFC role plus Authelia groups", "lands_in": "shared.roles — box_admin, customer, district_planner, educator, farmer, food_service, librarian, manager, researcher, student, viewer, worker"}, {"id": "people", "title": "People holding a role", "state": "live", "detail": "28 people, but only 5 of the 12 roles are actually held: farmer 16, viewer 7, box_admin 3, manager 1, worker 1", "lands_in": "shared.people.box_role"}, {"id": "hub-role", "title": "Role × hub", "state": "live", "detail": "18 mappings decide which hub each role can enter. Box Admin has none — it is superuser-only by design", "lands_in": "commons.hub_role"}, {"id": "role-grant", "title": "Scoped grants", "state": "partial", "detail": "Scoped, expiring and revocable grants, additive to the standing role — the mechanism a CGO needs to lend authority without handing it over. Built and verified; 0 issued", "lands_in": "shared.role_grant — 0 rows"}, {"id": "authelia", "title": "One identity, every app", "state": "live", "detail": "Single sign-on carries the role into each application rather than each app keeping its own user list", "lands_in": "Authelia groups per role"}], "gap": {"detail": "The vocabulary has no word for the roles the card is actually about. There is no steward, no witness, no convener — the people who hold authority in a CGO handoff are unrepresentable, so the box records the farm role someone happens to have instead.", "suggestion": "Add steward and witness to shared.roles, and issue them as scoped grants rather than standing roles: authority for this cycle, this hub, this cohort. The grant table is already built and waiting for its first row."}, "hub_presence": {"farmer": "5 roles", "science": "4 roles", "commons": "6 roles", "district": "1 role", "school": "2 roles", "box-admin": "superuser only"}}, {"n": 2, "key": "protocols", "title": "Protocols", "statement": "Write it so it holds without you.", "line": "An agreement that works only while its author is in the room is a habit, not a protocol.", "icon": "fi:fhb-governance", "essence": "The agreed upon rules and procedures that guide correct conduct, communication, and decision-making within the community and organization.", "practice": "The box's protocols are written twice: once in words people read aloud and sign, and once as rules the database enforces. Where only the first exists, the protocol is a promise; where both exist, it is a mechanism.", "reflect": "Which of your agreements would still hold if the person who wrote them left?", "count": 6, "count_label": "consent regimes declared", "components": [{"id": "regimes", "title": "Consent regimes", "state": "live", "detail": "6 regimes, each naming what withdrawal actually does. Governance testimony cannot un-make a published recommendation — withdrawal damages legitimacy, not accuracy. Education records make exposure unrepresentable rather than merely discouraged", "lands_in": "commons.consent_regime — one per hub"}, {"id": "receipts", "title": "Consent receipts", "state": "live", "detail": "31 receipts: 18 for lots, 7 for people, 4 for peer boxes, 2 for farms; 1 given by voice. 0 revoked; 1 with an expiry", "lands_in": "governance.consent_receipt, 2026-07-31 → 2026-09-06"}, {"id": "stewards-agreement", "title": "The Steward's Agreement", "state": "live", "detail": "Five questions, seven affirmations, seven reciprocities, revisable by the stewards who live under it. Carried on the shelf as text, and used as a setup gate", "lands_in": "canon shelf · Field Zine #2 v1.1"}, {"id": "phase-revocation", "title": "Phase-dependent revocation", "state": "live", "detail": "During listening a withdrawal deletes; after publication it can only record an amendment. Enforced by a trigger, not by a convention", "lands_in": "cll_lwg_cycles.status"}, {"id": "odrl", "title": "Machine-readable terms", "state": "planned", "detail": "The table that would let a receipt point at terms software can act on is empty, so every receipt's terms are prose a human must read", "lands_in": "governance.odrl_policies — 0 rows"}, {"id": "custody", "title": "Custody ≠ access", "state": "partial", "detail": "Holding someone's backup is deliberately a different permission from reading it. Built; no grant issued yet", "lands_in": "governance.custody_grant, custody_holding — 0 rows"}], "gap": {"detail": "31 receipts point at 0 machine-readable policies. The consent layer can record that somebody agreed, but not what they agreed to in a form any other program can check — which is precisely the part that has to travel when data moves between boxes.", "suggestion": "Write one ODRL policy per consent regime — six rows — and bind existing receipts to them. That turns the receipt from a note into a term."}, "hub_presence": {"farmer": "owner-held", "science": "research consent", "commons": "public reference", "district": "governance testimony", "school": "education records", "box-admin": "administrative"}}, {"n": 3, "key": "tools", "title": "Tools", "statement": "A decision should leave a trace.", "line": "The instruments a group decides with are the record of how it decided, or they are nothing.", "icon": "fi:fhb-co-creation", "essence": "The analog, digital, and procedural instruments (e.g., voting platforms, digital wallets, data systems) that enable the CGO to function and make collective decisions.", "practice": "Most of this box is tools, so the question is not how many there are but which ones a decision actually passes through — and whether they leave a trace anyone can check afterwards.", "reflect": "When your group decided something last, what did you use — and could a stranger reconstruct the decision from what it left behind?", "count": 109, "count_label": "cards across 6 hubs", "components": [{"id": "gov-surfaces", "title": "Governance surfaces", "state": "live", "detail": "Policies, Consent, Researchers and the Audit Log — the four screens in the launcher's Governance section", "lands_in": "/admin/#/governance"}, {"id": "hubs", "title": "Hubs", "state": "live", "detail": "6 hubs, 109 cards. Each hub carries its own consent regime, so where a tool sits decides the terms it works under", "lands_in": "commons.hub, hub_card"}, {"id": "question-sets", "title": "Talk to the … question sets", "state": "live", "detail": "The interview tool the card itself points at — structured conversations that produce cards rather than a form that produces rows", "lands_in": "the question-set suite"}, {"id": "eta", "title": "Ethical Tech Assessment", "state": "live", "detail": "Scores a tool against the GIAA six pillars. 143 assessments held, none of them of this box's own equipment", "lands_in": "/eta/"}, {"id": "audit", "title": "Audit log", "state": "partial", "detail": "818 events, 818 of them written by `system` and every one from the certification pipeline. Zero governance or consent actions are logged", "lands_in": "governance.audit_log"}, {"id": "researcher-access", "title": "Researcher access", "state": "planned", "detail": "The surface for granting an outsider consent-gated access exists; no grant has been made", "lands_in": "governance.researcher_access — 0 rows"}], "gap": {"detail": "The audit log is the tool whose entire job is to make decisions reviewable, and it holds no decisions — 818 rows of certification machinery and not one consent grant, role change or withdrawal. A CGO that cannot show its own decision history has tools but no accountability.", "suggestion": "Log every write to consent_receipt, role_grant and custody_grant as a governance event with a human actor. The table already has the columns; nothing writes to them."}, "hub_presence": {"farmer": "36 cards", "science": "12 cards", "commons": "23 cards", "district": "1 card", "school": "26 cards", "box-admin": "11 cards"}}, {"n": 4, "key": "ceremonies", "title": "Ceremonies", "statement": "Some moments should not be a form.", "line": "A gathering that marks a transition is what makes a decision belong to the people in the room.", "icon": "fi:fhb-food-traditions", "essence": "The intentional gatherings or rituals that mark important moments, decisions, or transitions, grounding the organization's work in cultural and relational meaning.", "practice": "The box already has one real ceremony: a new box will not finish its setup until its steward has answered five questions — LAND, COMMUNITY, LINEAGE, BOX, FUTURE STEWARD — in their own words, in front of a witness who cannot revise the answer. Seven boxes were handed over that way.", "reflect": "What moment in your community's year would be wrong to do over a form?", "count": 2, "count_label": "handovers recorded on this box", "components": [{"id": "five-questions", "title": "The Five Questions", "state": "live", "detail": "A technical gate, not paperwork: the first-run wizard does not complete and federation is not offered until the answer is recorded", "lands_in": "the setup wizard · canon shelf"}, {"id": "enrollment", "title": "Recorded handovers", "state": "partial", "detail": "2 completed enrolments are recorded here. Seven boxes were handed over in the GIAA / DWeb Camp ritual — the other five left no row on this box", "lands_in": "flash.enrollment_completion — 2 rows"}, {"id": "cycle-phases", "title": "Cycle phases", "state": "live", "detail": "Publication is treated as a moment that changes what may be withdrawn — the closest thing the data model has to a rite of passage", "lands_in": "cll_lwg_cycles.status"}, {"id": "witness", "title": "Witnessing", "state": "planned", "detail": "The affirming steward, the reading aloud, the deliberately slow handshake in front of others — none of it is represented anywhere in the schema", "lands_in": "nothing on this box"}, {"id": "revision", "title": "Answer, then revision", "state": "planned", "detail": "Stewards revise their first answer weeks later; the zine permits it. Nothing preserves both the seed and the revision with lineage intact", "lands_in": "nothing on this box"}], "gap": {"detail": "Ceremonies are the element the card treats as co-equal with the other three, and the only one this box can barely represent. Roles, protocols and tools each have tables; a witnessed handover has two rows in an enrolment table that records a hostname and an IP address. The ritual that made the federation real is, to the software, a device registration.", "suggestion": "Give the ceremony a record of its own: who answered, who witnessed, what was affirmed, when, and what was revised afterwards — with the seed answer kept, not overwritten. It is one table, and it is the difference between a network that was handed over and a fleet that was provisioned."}, "hub_presence": {"farmer": "—", "science": "—", "commons": "—", "district": "—", "school": "—", "box-admin": "2 handovers"}}], "reflections": ["What CGO elements — roles, protocols, tools and ceremonies — does your community or organization already have in place that guide how decisions get made? Briefly describe them.", "Do these elements reflect the value systems and cultural knowledge systems of your community or organization? If not, how can you transform them so they do?"], "art": [{"src": "assets/img/cgo-card-front.jpg", "alt": "Illustrated card front: a river running from a woven basket past corn, pottery and a hummingbird, three people seated in conversation, solar panels and wind turbines, under the hand-lettered headline Worldbuilding While the World Burns.", "caption": "“Worldbuilding While the World Burns” — the reference piece the CGO card follows.", "credit": "Artwork by Jenni, created for the CGO collateral card. Shown as printed for SVN's Global Gathering 2026."}, {"src": "assets/img/cgo-card-back.jpg", "alt": "The reverse of the card: five bold statements each with a one-line explanation, above a bordered Reflections panel with two open prompts, illustrated with corn, leaves and a painted pot.", "caption": "The reverse: bold statement over one line, and the Reflections panel this page's own panel follows.", "credit": "Artwork by Jenni — the card's reverse, with the Reflections panel."}], "toolkit": {"source": {"repo": "farmhack/governance", "ref": "toolkit/cgo-governance-toolkit", "pr": 1, "merged": false, "sha": "cdc4dd8", "date": "2026-09-24", "fresh": true, "tags": []}, "counts": {"source": "live", "as_of": "2026-09-28", "static": {"eta_n": {"as_of": "2026-09-18", "note": "ETA registry assessments; the registry is not in this database"}}}, "frame": [{"name": "Commons", "cells": {"roles": "Council, fiscal host, provisional body + sunset", "protocols": "Charter as meta-constitution", "tools": "Signatory registry", "ceremonies": "Reaffirmation, charter-by-concordance"}}, {"name": "Community", "cells": {"roles": "Steward Circle, binding seats incl. more-than-human guardians", "protocols": "Charter templates, rule menu, det/judgment worksheet", "tools": "Governance card, federation handshake", "ceremonies": "Transition deck, revision convening"}}, {"name": "Action area", "cells": {"roles": "Scoped, expiring grants", "protocols": "Phase-gated consent, machine-readable terms", "tools": "Proposal → opinion → tally, sensor-triggered proposals", "ceremonies": "Listening → publish phases"}}, {"name": "Node", "cells": {"roles": "Steward, witness, successor; <b>maturity register<\/b>", "protocols": "<b>Steward's Agreement<\/b> + local schedule, exit addendum, refusal record", "tools": "Governance card, audit log, <b>advisory agent<\/b>", "ceremonies": "Five questions witnessed; seed + revision kept"}}], "maturity": {"position": ["<b>Benevolent feudalism is a necessary stage, not a failure.<\/b> A young network needs someone who can run servers, mint keys, cut releases and hold the registry. Schneider names the root driver: <i>running servers requires expertise<\/i>. Handing a power to a steward who cannot yet exercise it does not decentralise anything. It creates an outage, or a quiet re-centralisation to whoever fixes the outage. The skipped key-mint at the DWeb Camp handoff showed how much pressure a handoff is under.", "<b>A benevolent stage is legitimate only while three things hold.<\/b> The stage is <b>declared<\/b> (every power is written down along with who holds it), it is <b>bounded<\/b> (every power has a next stage and a review date), and it is <b>checked<\/b> (the people who live under it can see progress, and they can say it isn't enough).", "<b>This is the pattern the Charter draft already uses.<\/b> AKC Charter v1.1 Art. VIII has a provisional body, time-boxed, that hands authority on at a quorum threshold <i>or<\/i> a sunset date, whichever comes first. The Steward's Agreement uses a \"steward bootstrap, then quorum\" pattern. This plan applies the same rule to each operational power, not just to the council.", "<b>Accidents are not stages.<\/b> A power held <i>deliberately<\/i> can mature in stages. A power that exists <i>by accident<\/i>, such as keys shared between boxes because a flash step was skipped, is a defect. It gets fixed on its own schedule and never gets relabelled as \"stage 0\"."], "stages": [{"n": 0, "name": "Founding", "means": "The founding stewards hold the power and use it for the network", "legit": "It is <i>declared<\/i> in the Power Register, with a named holder and a next-stage date"}, {"n": 1, "name": "Accountable", "means": "Same holder, but every use leaves a trace that stewards can read", "legit": "Uses are logged as governance events. Emergency uses are reported afterwards, with reasons"}, {"n": 2, "name": "Witnessed", "means": "Use needs a second party: a second steward, a signature, or a box that can refuse", "legit": "Nobody acts alone. Each box's steward can pin a version or decline"}, {"n": 3, "name": "Polycentric", "means": "The power is held at the scale where trust lives: per community, per box, or per action area", "legit": "More than one holder exists and each can run without the founders. The capacity has been demonstrated, not assumed"}, {"n": 4, "name": "Exit to community", "means": "The founders hold no power that others lack. The federation keeps only what the Charter reserves, which is ratifying the protocol", "legit": "Stewards affirm at an assembly that the handoff is real. This is the closing milestone review"}], "powers": [{"id": "P1", "power": "Publish the <code>/admin/<\/code> release that boxes pull automatically", "holder": "Founding operator", "stage": "0", "stage_n": 0, "next": "<b>1:<\/b> every release logged with a changelog + who published it. <b>2:<\/b> releases signed; each box's steward can pin a version or refuse", "probe": "A box shown an unsigned release <b>refuses it<\/b>; a pinned box stays pinned"}, {"id": "P2", "power": "Fleet identity writes (Authelia)", "holder": "box-01 operator", "stage": "0", "stage_n": 0, "next": "<b>1:<\/b> identity changes logged. <b>2:<\/b> per-box identity-admin issued as a scoped <code>role_grant<\/code>. <b>3:<\/b> local steward runs their box's identity (box-09 shows it can be done)", "probe": "A non-founder steward adds a user on their own box without box-01"}, {"id": "P3", "power": "Author the governance repo + commons registry", "holder": "box-01", "stage": "0", "stage_n": 0, "next": "<b>1:<\/b> off-site mirror (durability comes before distribution). <b>2:<\/b> changes need review by a non-founder. <b>3:<\/b> authority is set per repo, not per box", "probe": "Delete the box-01 copy in a drill: the corpus survives and can still be edited"}, {"id": "P4", "power": "Admit a node to the private network (Headscale)", "holder": "box-04 operator", "stage": "0", "stage_n": 0, "next": "<b>1:<\/b> every enrolment logged against a witnessed ceremony. <b>3:<\/b> a control plane per community. The box-05 sovereign Headscale is the working prototype", "probe": "A community enrols a node with no founder action"}, {"id": "P5", "power": "Superuser across hubs (<code>box_admin<\/code>)", "holder": "3 people", "stage": "0", "stage_n": 0, "next": "<b>1:<\/b> superuser actions visible to each hub's stewards. <b>2:<\/b> hub-scoped grants replace blanket superuser for routine work", "probe": "A hub steward can list every superuser action in their hub"}, {"id": "P6", "power": "Admit a steward to the federation (witnessing)", "holder": "Founding steward", "stage": "0", "stage_n": 0, "next": "<b>2:<\/b> any steward in good standing may witness (the Covenant already allows this). <b>3:<\/b> peers admit and decline by consensus (Charter Art. IX)", "probe": "A handoff happens with no founder in the room, and it is recorded as a ceremony"}, {"id": "P7", "power": "Draft and revise the Steward's Agreement (<b>the working reference document<\/b>) and the Charter", "holder": "Founder, plus reviewers", "stage": "0→1 (review comments already public; <b>no versioning process yet<\/b>)", "stage_n": 0, "next": "<b>1:<\/b> a canonical versioned source + open redline intake (exploration §5a). <b>2:<\/b> the v1.2 convening adopts changes from the stewards' redlines under a decision rule declared in advance. <b>3:<\/b> the provisional body; the Art. VIII quorum or sunset trigger is set at first assembly", "probe": "A text change is adopted that the founder did not author"}, {"id": "P8", "power": "Allocate stipends and the localization fund", "holder": "Founder / fiscal host", "stage": "0", "stage_n": 0, "next": "<b>1:<\/b> allocations published. <b>2:<\/b> recipients take part in allocation (the Big Green DAO practice in cohort 2)", "probe": "A funding decision is made by a body that includes recipients"}, {"id": "P9", "power": "Run the build and flash that creates new boxes", "holder": "Founding operator", "stage": "0", "stage_n": 0, "next": "<b>2:<\/b> the flasher is reproducible from the repo by a second person. <b>3:<\/b> a community flashes its own boxes", "probe": "A non-founder builds a working box from source"}], "defects": [{"id": "D1", "defect": "A signing key that is not unique per box", "why": "Nobody chose it, and it breaks the Covenant (\"your key is yours\"). It makes peer admission forgeable", "fix": "Mint a per-box key as a <b>first-boot gate<\/b>; rotate on every flash; re-key the affected boxes"}, {"id": "D2", "defect": "A backup identity that is not unique per box", "why": "Holding a backup becomes reading it, which breaks custody ≠ access", "fix": "Per-box identity + re-encrypt"}, {"id": "D3", "defect": "Credentials stored in cleartext on some boxes", "why": "Authority leaks to anyone with shell access", "fix": "Tracked by the fleet remediation tooling"}], "safeguards": [{"title": "The register is the declaration.", "text": "A power that is not in the register is not legitimately held. When a new power is discovered, it is entered at stage 0 with a date, and not quietly kept."}, {"title": "Every power has a review date.", "text": "Reviews fall at the annual reaffirmation plus a mid-year check. When a review date is missed, the holder must give a public reason. <b>Silence cannot be how a stage stays in place.<\/b> This is the Art. VIII \"threshold or sunset, whichever first\" rule at the level of a single power."}, {"title": "The ratchet.", "text": "A power only moves back to an earlier stage through a <b>recorded ceremony with a stated reason<\/b> (a security incident, or a steward who has left). Moving backwards is sometimes right, but it is never silent."}, {"title": "Evidence is a probe, not a claim.", "text": "Each stage change is shown by a demonstration that would fail if the change were not real (the probe column in §3). This rule comes straight from what this fleet has learned. We have logged \"up-to-date\" while serving the wrong directory, and we have passed our own gates on a match in a comment. A handoff counts as real when the new holder acts and it works."}, {"title": "Capacity travels with power.", "text": "No power moves to stage 3 without a runbook, a practice run, and a named second holder. Stage 3 without capacity is how networks re-centralise by accident."}, {"title": "Emergency powers are bounded.", "text": "The founders may act alone in an emergency. The action is logged, reported to the affected stewards within a set window, and reviewed at the next circle. An emergency never becomes a new standing power."}, {"title": "Those who live under it decide whether it is enough.", "text": "At each reaffirmation the stewards receive the register and the stage changes, and they record a ceremony: <i>progress affirmed<\/i>, or <i>progress insufficient<\/i> with reasons. That record is the legitimacy signal, and the founders cannot write it."}, {"title": "The advisory agent watches, but never judges or acts.", "text": "A local-model agent (always advisory) can read the register and the governance log. It reports powers past their review date, uses that were never logged, and probes that have not been re-run. It writes opinions, and people decide. This gives the agent its first job, which is low-risk and useful."}], "measures": ["Powers by stage: a count and a list, with change since the last review.", "<b>How many people can do it:<\/b> for each power, how many people have exercised it successfully.", "Share of boxes with their own keys and their own identity admin (moves when D1/D2 are fixed and P2 matures).", "<code>role_grant<\/code> rows issued to non-founders (today: 0).", "Governance events in the audit log (today: 0 of 818 rows).", "Handoffs and ceremonies completed without a founder present.", "Review dates missed, and the reasons given."], "milestones": [{"when": "Now → Oct", "what": "Register v0.1 re-verified; defects D1–D3 scheduled; safeguards 1–4 written into the Charter review packet as the operational form of Art. VIII"}, {"when": "Charter review (AKC draft)", "what": "Stewards see the register alongside the Charter. The Charter's provisional-body clause and this plan use the same trigger language"}, {"when": "Cohort-2 window (Oct → Mar)", "what": "Every power at stage 1 (logged). P6 and P7 reach stage 2 through cohort-2 handoffs and the v1.2 convening. D1/D2 closed before cohort-2 boxes ship"}, {"when": "First reaffirmation", "what": "The stewards' progress ceremony (safeguard 7); the register is re-dated"}, {"when": "Readiness for exit to community (months out)", "what": "<b>The closing review:<\/b> the full audit of who holds power. A power not at stage 3–4 gets a named plan, or a stated reason why it should stay federated"}]}, "questions": [{"id": "A", "title": "The reference document and its process", "items": [{"id": "A1", "q": "What decision rule adopts a new version of the Steward's Agreement: consent, consensus or supermajority?", "test": "Declare a rule before the first review window opens, then run the v1.2 convening under it", "who": "The first convening"}, {"id": "A2", "q": "How long does a review window stay open, and in which languages must the text exist before it closes?", "test": "Run one window with the two waiting redlines", "who": "Stewards"}, {"id": "A3", "q": "Is <code>v1.1<\/code> tagged as the canonical baseline?", "test": "A tag here, affirmed at a gathering", "who": "Stewards"}, {"id": "A4", "q": "When do the AKC Charter draft and Concept Note A join this repo? The repo is public", "test": "Dorn's call on timing and redaction", "who": "Dorn"}, {"id": "A5", "q": "How does the Agreement reconcile with the Charter once the Charter is reviewed (Charter Art. III)?", "test": "A consistency check during the Charter review", "who": "Charter reviewers"}]}, {"id": "B", "title": "Maturity and legitimacy", "items": [{"id": "B1", "q": "Where does the Power Register live: YAML here, or a DB table the agent can read?", "test": "Start with YAML; move it when the audit log records decisions", "who": "Dorn + builders"}, {"id": "B2", "q": "What is the review cadence: annual reaffirmation, plus a mid-year check?", "test": "The first reaffirmation", "who": "Stewards"}, {"id": "B3", "q": "Who receives reports of emergency power use before a Steward Circle exists?", "test": "Name a recipient; test with a drill", "who": "Dorn, then the Circle"}, {"id": "B4", "q": "Which powers stop at stage 3 because the Charter reserves them to the federation?", "test": "Draft a list for the Charter review", "who": "Charter reviewers"}, {"id": "B5", "q": "Do the probes in the Power Register actually fail when a handoff is fake?", "test": "Run each probe against a known-bad setup first", "who": "Builders, witnessed by a steward"}]}, {"id": "C", "title": "Architecture choices", "items": [{"id": "C1", "q": "Is the governance card per community, per node, or both, with nodes inheriting? (Recommendation: both)", "test": "Fill one community card + two node cards", "who": "Cohort stewards"}, {"id": "C2", "q": "Are cards invited or required alongside the Charter review? (Recommendation: invited; collected as the rule-menu sample)", "test": "Invite cohort-1/2 + LWG districts", "who": "Dorn"}, {"id": "C3", "q": "Agent model: is the local floor + fleet-owned T3 enough, with no cloud?", "test": "Run the advisory agent on the historical corpus using local models only", "who": "Dorn"}, {"id": "C4", "q": "Reference more-than-human case: Sallie/SGMA groundwater, or an on-box LWG + FieldKit prototype first?", "test": "Prototype a sensor-triggered proposal", "who": "Dorn + Sallie"}, {"id": "C5", "q": "Seat model: one design for Smith's guardian seats and the binding Indigenous seats. Binding or advisory?", "test": "Draft the Steward Circle seat clause; review with Indigenous partners", "who": "Circle + partners"}, {"id": "C6", "q": "Community layer: Bonfire (native governance tools) or the Matrix plan?", "test": "A trial Bonfire instance next to Matrix", "who": "Dorn"}, {"id": "C7", "q": "Blockchain posture: map Smith's four domains onto our own primitives, with no chain", "test": "Confirm in writing", "who": "Dorn"}]}], "agreement": {"title": "The Steward's Agreement", "version": "v1.1", "kicker": "STEWARD FIELD ZINE #2 · v1.1", "credits": "Farm Hack · OpenTEAM · NMCC · IndigiDAO · 11th Hour · AKC · CGO · CC BY 4.0", "footer": "read slowly · adopt only at a gathering · revised by the stewards who live under it", "tagline": "NOT A EULA. A COVENANT.", "pace": ["→ read in one sitting", "→ better weeks than an afternoon", "→ witnessed, not clicked", "→ revised by its stewards", "→ adopted only at a gathering"], "ritual": [{"k": "", "v": "Five movements — read, don't skim."}, {"k": "", "v": "Seven affirmations — what you give."}, {"k": "", "v": "Seven reciprocities — what the commons gives back."}, {"k": "", "v": "Witnessed by a steward in good standing."}, {"k": "", "v": "A first signed record — the seed of your persona."}], "questions": [{"k": "LAND", "v": "what ground is this, and what do you owe it?"}, {"k": "COMMUNITY", "v": "who is this for, and who decides?"}, {"k": "LINEAGE", "v": "whose work do you inherit and carry on?"}, {"k": "BOX", "v": "what will this machine hold, and what will it refuse?"}, {"k": "FUTURE STEWARD", "v": "who receives the seat after you?"}], "promise": [{"label": "SEVEN AFFIRMATIONS — WHAT YOU GIVE", "items": [{"k": "PRESENCE", "v": "show up, gather, witness other stewards."}, {"k": "CONSENT (3a)", "v": "the moment consent is withdrawn, stop sharing. Without question."}, {"k": "DESTRUCTION (3b)", "v": "erase what's asked — unless law or safety says seal it. Never bury harm."}, {"k": "HONEST FAILURE", "v": "keep a true record of what went wrong."}, {"k": "SUCCESSION", "v": "name who receives your box and records."}]}, {"label": "THE BOUNDARIES — WHAT YOU REFUSE", "items": [{"k": "", "v": "sell or transfer commons data"}, {"k": "", "v": "surveil the people who work the land"}, {"k": "", "v": "become a chokepoint others depend on"}, {"k": "", "v": "override a community's TK / Biocultural label"}]}], "back": [{"label": "SEVEN RECIPROCITIES — WHAT YOU RECEIVE", "items": [{"k": "A REAL PROMISOR", "v": "Farm Hack (with OpenTEAM) holds the commons' side. An address to write to, not a feeling."}, {"k": "A TRUE LOAN", "v": "the box is on loan (a bailment): it can't be seized for an unrelated debt, and it reaches your successor, not your creditors."}, {"k": "SUCCESSION THAT WORKS", "v": "a short written designation moves your records when the moment comes."}, {"k": "DEFENSE", "v": "help standing up to an overbroad demand for your data."}, {"k": "BACKUP", "v": "your records survive the fire."}]}], "covenant": [{"k": "OPEN KNOWLEDGE, CLOSED SECRETS", "v": "what we know we share; the keys that protect us we guard."}, {"k": "YOUR KEY IS YOURS", "v": "no one, not even Farm Hack, holds a master key to your box."}, {"k": "A STOLEN DRIVE IS A BRICK", "v": "records sealed, opened only by your key."}, {"k": "CAREFUL ADMISSION", "v": "new boxes are vouched in; a bad actor is declined by consensus. We stop shaking its hand."}, {"k": "FOR THE WORST DAY", "v": "written walk-throughs + optional split-key recovery among stewards you choose."}], "will_not": ["NO MASTER KEY", "NO KILL SWITCH", "NO WATCHTOWER", "NO SCORE", "NO PHONING HOME", "NO PUNISHMENT FROM ABOVE"], "boxes": [{"title": "THE PACE", "body": "Meant to be read in one sitting. Still better to take weeks than an afternoon. The seat is not going anywhere."}, {"title": "THE FIRST GIFT", "body": "Your first record is signed by your own key. It is the seed of your persona — the beginning of your word in the federation."}, {"title": "PROMISES NEED A PROMISOR", "body": "v1.1 names who stands behind each one — so the kindest promises are keepable, not just spoken."}, {"title": "THE ONLY ENFORCEMENT", "body": "Neighbors stop shaking the hand of a node that exfiltrates raw data. A refusal among equals — never a sentence from above."}], "adoption": ["No editor is in charge. It is revised by the stewards who live under it, and adopted only by stewards, at a gathering."], "tagged": false, "process": [{"text": "<b>One canonical, versioned source.<\/b> The v1.0 docx, the v1.1 amendments and the Security Covenant are in <code>farmhack/governance<\/code> (one commit, 06-14). <b>The v1.1 zine source is not.<\/b> Commit it on box-01 and tag it <code>v1.1<\/code>. The zine, PDF and translations are <i>builds<\/i> from that source. They are never edited on their own.", "sub": []}, {"text": "<b>Open intake of redlines.<\/b> Any steward may propose a change: by email, by Forgejo issue or PR, or by voice through a talk-to-the question set. Each redline records who, which clause, the proposed text and the reason. <b>The two waiting redlines are entered first<\/b>, credited to their authors.", "sub": []}, {"text": "<b>An announced review window, readable in the stewards' languages.<\/b> A draft version opens for a fixed period. Comments do not close until the text is available in the languages the stewards use (en/es/fr at least, following cohort 1). Otherwise review only reaches English speakers.", "sub": []}, {"text": "<b>Adoption at a convening (a ceremony, not a merge).<\/b> The stewards who live under the Agreement adopt the new version at a convening, which the zine's back cover promises. <b>The decision rule is declared before the window opens<\/b> (consent, consensus or supermajority: a deterministic clause, and so a question for the first convening).", "sub": []}, {"text": "<b>Version classes:<\/b>", "sub": ["<b>patch:<\/b> wording, translation or typo. No change to what anyone owes or is owed.", "<b>minor:<\/b> adds a protection or a clarification. Reduces no steward's rights.", "<b>major:<\/b> changes an affirmation, refusal, reciprocity or the five questions. <b>Each steward re-affirms individually.<\/b>"]}, {"text": "<b>No \"or any later version\".<\/b> A steward is bound by the version they affirmed until they affirm a newer one. The founders cannot change a steward's terms by publishing. The node card already carries <code>steward_agreement.version<\/code>, so each box records which version its steward holds.", "sub": []}, {"text": "<b>Lineage kept.<\/b> Every version, redline and adoption record stays in the repo, as ceremony records hold the seed answer (§4 Ceremonies). A superseded version is marked superseded and never deleted.", "sub": []}, {"text": "<b>Reconciled with the Charter later.<\/b> When the AKC Charter review completes, its Art. III already makes the Agreement the node-scale instrument. The Charter review then checks the Agreement for consistency rather than replacing it.", "sub": []}], "redlines": {"waiting": 2, "entered": 0, "note": "Two stewards’ redlines are waiting with no path to adoption. None has been entered in an intake yet."}}, "gaps": [{"name": "governance.ceremony", "exists": false, "what": "A witnessed handover, reaffirmation or revision, with the seed answer kept"}, {"name": "governance.refusal", "exists": false, "what": "A steward or community saying no, recorded as a thing rather than an absence"}, {"name": "governance.proposal", "exists": false, "what": "A question put to a community by a person, a sensor or the advisory agent"}, {"name": "governance.power_register", "exists": false, "what": "The Power Register, where probes and the agent can read it"}]}};</script>
<script>
(function(){
'use strict';
var D = window.CGO, view = document.getElementById('view');
var ACC = { roles:'var(--clay)', protocols:'var(--teal)', tools:'var(--corn)', ceremonies:'var(--sage)' };
var STATE_DOT = { live:'#4CAF50', partial:'#F57F17', planned:'#BDBDBD' };
var STATE_SAYS = { live:'in use', partial:'built, barely used', planned:'not built yet' };
function esc(s){ return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];}); }
/* A numbered medallion, not an icon. The box's four fhb-* glyphs are all
hexagon-framed and read as the same mark at 22px, and the card's imagery is
illustration rather than iconography — so the element's number in its own
colour is both clearer and honest about where the artwork belongs. */
function mark(el,size){
size = size || 34;
return '<span class="medallion" style="width:'+size+'px;height:'+size+'px;border-color:'+ACC[el.key]+';color:'+ACC[el.key]+
';font-size:'+Math.round(size*.46)+'px">'+el.n+'</span>';
}
function band(){ return '<div class="band">'+D.elements.map(function(e){ return '<i style="background:'+ACC[e.key]+'"></i>'; }).join('')+'</div>'; }
function attribution(){
var a = D.attribution;
return esc(a.source_label)+' · '+esc(a.byline)+' · <a class="lnk" href="canon.html#steward">the Steward’s Agreement, on the canon shelf</a>';
}
function figure(i){
var a = (D.art||[])[i];
if (!a) return '';
return '<figure class="art"><img src="'+esc(a.src)+'" alt="'+esc(a.alt)+'" loading="lazy" data-zoom'+
' data-caption="'+esc(a.caption)+'" data-credit="'+esc(a.credit)+'">'+
'<figcaption><b>'+esc(a.caption)+'</b>'+esc(a.credit)+'</figcaption></figure>';
}
function artslot(kind, text){
return '<div class="artslot"><span class="k">'+esc(kind)+'</span><span class="t">'+esc(text)+'</span></div>';
}
function reflections(hint){
return '<section class="reflectbox"><h2><i></i>Reflections<i></i></h2><ol>'+
D.reflections.map(function(r){ return '<li>'+esc(r)+'</li>'; }).join('')+'</ol>'+
(hint ? '<p class="hint">'+esc(hint)+'</p>' : '')+'</section>';
}
/* ───────────── the card, unfolded ───────────── */
function block(el){
return '<a class="q-card" style="--acc:'+ACC[el.key]+'" href="#/'+el.n+'">'+
'<div class="top"><span class="n">0'+el.n+'</span><h3>'+esc(el.title)+'</h3></div>'+
'<p class="statement">'+esc(el.statement)+'</p>'+
'<p class="line">'+esc(el.line)+'</p>'+
'<p class="quote">'+esc(el.essence)+'</p>'+
'<div class="holds"><b>'+el.count+'</b><span>'+esc(el.count_label)+'</span></div>'+
'<div class="spheres">'+el.components.map(function(c){
return '<span class="sph '+(c.state==='live'?'has':'none')+'" data-tip="'+esc(c.title+' — '+STATE_SAYS[c.state])+'">'+esc(c.title)+'</span>';
}).join('')+'</div></a>';
}
function renderList(){
view.className = 'stack';
view.innerHTML =
'<section class="front">'+band()+
'<div class="frontgrid"><div>'+
'<p class="eyebrow">Community Governed Organizations</p>'+
'<h1>Roles, protocols, tools and ceremonies.</h1>'+
'<p class="tagline">“'+esc(D.attribution.tagline)+'”</p>'+
'<p class="lede">Four elements make a community able to govern itself: the responsibilities people hold, '+
'the rules they agree to, the instruments they decide with, and the gatherings that mark a decision. '+
'This is the card, then what this box actually holds for each one — including where it holds almost nothing — '+
'and the toolkit that grows from it: four scales, the Steward’s Agreement, a maturity plan and the questions still open.</p>'+
'<div class="go"><a href="#/scales">The four scales →</a><a href="#/agreement">The Steward’s Agreement →</a>'+
'<a href="#/maturity">The maturity plan →</a></div>'+
'</div>'+
figure(0)+
'</div>'+
'</section>'+
'<section><header class="grp-head"><h2>The four elements</h2>'+
'<span class="t-faint">From the card. Open one for what is here, what is built but unused, and what is missing.</span></header>'+
'<div class="blocks">'+D.elements.map(block).join('')+'</div></section>'+
doors()+
'<div class="cardpair">'+
reflections('Write on the card. The box keeps no copy of your answer — that is the point of asking on paper.')+
figure(1)+
'</div>'+
'<section class="front"><div class="cardfoot">'+
'<p><b>What this page is.</b> The card asks a community to name its own four elements. This surface answers the '+
'same four questions about the box in front of you, using counts from its own database rather than claims: '+D.elements.map(function(e){ return e.count+' '+e.count_label; }).join(' · ')+'. '+
'A count is what the software can show, not what a community does — five of the seven boxes handed over in the '+
'GIAA ritual left no record here, and nothing in the schema knows what a witness is.</p>'+
'<div class="qrslot">QR<br>SLOT</div>'+
'</div>'+
'<p class="t-faint" style="margin-top:14px;font-size:12px">'+attribution()+'</p><div style="margin-top:10px">'+sourceLine()+'</div></section>';
}
/* ───────────── one element ───────────── */
function component(c){
return '<div class="comp"><span class="dot'+(c.state==='planned'?' absent':'')+'" style="background:'+(STATE_DOT[c.state]||STATE_DOT.planned)+'" data-tip="'+esc(STATE_SAYS[c.state])+'"></span>'+
'<span style="min-width:0"><span class="nm">'+esc(c.title)+'</span>'+
'<span class="rl"><span>'+esc(STATE_SAYS[c.state])+'</span></span>'+
'<span class="li" style="font-family:inherit;font-size:13px;color:var(--ink-soft);line-height:1.65">'+esc(c.detail)+'</span>'+
'<span class="li">'+esc(c.lands_in)+'</span></span></div>';
}
function renderElement(n){
var el = D.elements.filter(function(e){ return String(e.n)===String(n); })[0];
if (!el) { view.className=''; view.innerHTML='<p class="t-body">No such element. <a class="lnk" href="#/">Back to CGO</a></p>'; return; }
var prev = D.elements[el.n-2], next = D.elements[el.n], acc = ACC[el.key];
view.className = 'stack-sm el-page';
view.innerHTML =
'<div class="crumb"><a href="#/">CGO</a><span>·</span><span>element '+el.n+' of 4</span></div>'+
'<div class="card pad-lg" style="--acc:'+acc+';border-left:5px solid '+acc+'"><div class="el-head">'+mark(el,44)+'<div style="min-width:0">'+
'<div class="el-n">Element '+el.n+' / 4</div><h1>'+esc(el.title)+'</h1>'+
'<p class="el-statement">'+esc(el.statement)+'</p>'+
'<p class="el-line">'+esc(el.line)+'</p>'+
'<p class="quotedef">'+esc(el.essence)+'</p>'+
'<p class="el-line">'+esc(el.practice)+'</p>'+
'<div class="reflect"><div class="el-n upper" style="font-family:inherit">Reflect</div><p>'+esc(el.reflect)+'</p></div>'+
'<div style="font-size:11px;color:var(--ink-faint);margin-top:16px">'+attribution()+'</div>'+
'</div></div></div>'+
'<section class="card" style="overflow:hidden"><header class="sect-head"><h2>What this box holds</h2>'+
'<span class="t-faint">'+el.components.filter(function(c){return c.state==='live';}).length+' of '+el.components.length+
' in use · a hollow dot is a mechanism that does not exist yet</span></header>'+
'<div class="divide">'+el.components.map(function(c){ return '<div class="sph-row">'+component(c)+'</div>'; }).join('')+'</div></section>'+
'<section><header class="grp-head"><h2>'+esc(el.title)+' at the four scales</h2><span class="t-faint">One column of the <a class="lnk" href="#/scales">toolkit frame</a>.</span></header>'+
'<div class="colstrip">'+T.frame.map(function(s){ return '<div class="cell" style="--acc:'+acc+'"><span class="sc">'+esc(s.name)+'</span>'+s.cells[el.key]+'</div>'; }).join('')+'</div></section>'+
'<section class="weak"><h2>Where this element is weak here</h2><p>'+esc(el.gap.detail)+'</p>'+
'<p class="mt2"><b style="font-weight:600">Suggestion: </b>'+esc(el.gap.suggestion)+'</p></section>'+
reflections()+
'<div class="pager">'+(prev?'<a href="#/'+prev.n+'">← '+esc(prev.title)+'</a>':'<span></span>')+
(next?'<a href="#/'+next.n+'">'+esc(next.title)+' →</a>':'<a href="#/matrix">By hub →</a>')+'</div>';
}
/* ───────────── four elements × six hubs ───────────── */
function ceremonyFinding(){
var c = D.elements[3], words = ['none','one','two','three','four','five','six','seven','eight','nine','ten'];
var empty = D.hubs.filter(function(h){ var v = c.hub_presence[h.id]; return !v || v==='—'; }).length;
var held = D.hubs.filter(function(h){ var v = c.hub_presence[h.id]; return v && v!=='—'; })
.map(function(h){ return h.label+' holds '+c.hub_presence[h.id]; });
return 'The Ceremonies row is the finding, not a rendering error: '+(words[empty]||empty)+' of '+(words[D.hubs.length]||D.hubs.length)+
' hubs hold nothing'+(held.length?', and '+esc(held.join('; '))+' — device enrolments, not witnessed ceremonies':'')+'.';
}
function renderMatrix(){
view.className = 'stack-sm';
view.innerHTML =
'<section class="front" style="padding:24px 26px">'+band()+
'<div class="row"><h1 style="font-family:var(--serif);font-size:26px;font-weight:600">The four elements, by hub</h1>'+
'<a class="lnk" href="#/">← Back to the card</a></div>'+
'<p class="lede" style="margin-top:8px">Each hub on this box carries its own consent regime, so the same element '+
'means something different depending on where a person is standing.</p></section>'+
'<div class="card tblwrap"><table class="mx"><thead><tr><th class="sticky"></th>'+
D.hubs.map(function(h){ return '<th scope="col"><div class="hub">'+esc(h.label)+'</div><div class="regime">'+esc(D.regimes[h.regime])+'</div></th>'; }).join('')+
'</tr></thead><tbody>'+
D.elements.map(function(el){
return '<tr class="el" style="--acc:'+ACC[el.key]+'"><th scope="row" class="sticky"><a href="#/'+el.n+'">'+mark(el,22)+
'<span class="rt">'+esc(el.title)+'</span></a></th>'+
D.hubs.map(function(h){
var v = el.hub_presence[h.id];
return v && v !== '—'
? '<td><a href="#/'+el.n+'"><span class="cellv">'+esc(v)+'</span></a></td>'
: '<td style="text-align:center"><span style="color:var(--rule)" data-tip="Nothing here yet — the box does not represent this element in this hub.">·</span></td>';
}).join('')+'</tr>';
}).join('')+
'</tbody></table></div>'+
'<div style="padding:0 4px"><p style="font-size:13.5px;color:var(--ink-soft);line-height:1.7">'+ceremonyFinding()+'</p>'+
'<p class="t-faint" style="margin-top:8px;color:var(--ink-faint)">'+esc(D.attribution.naming_note)+'</p>'+
'<p class="t-faint" style="margin-top:8px;color:var(--ink-faint)">'+esc(D.attribution.art_note)+'</p></div>'+
reflections();
}
/* ═════════════ THE TOOLKIT ═════════════
Strings under D.toolkit that end in HTML (cells, powers, questions, process
steps) were rendered from the governance repo's markdown by the build, which
escaped them first; everything else still goes through esc(). */
var T = D.toolkit;
var STAGE_C = ['var(--clay)','var(--corn)','var(--river)','var(--sage)','var(--teal)'];
var SCALE_GLOSS = {
'Commons':'The Charter, across the whole federation',
'Community':'A CGO or steward circle',
'Action area':'One effort with its own cycle, such as a district’s listening-to-publish round',
'Node':'One box and one steward — where the Steward’s Agreement lives'
};
function qlink(id){ return '<a class="qref" href="#/questions/'+esc(id)+'">'+esc(id)+'</a>'; }
function qlinks(ids){ return ids.map(qlink).join(' · '); }
function openCount(){ return T.questions.reduce(function(n,g){ return n+g.items.length; },0); }
function sourceLine(){
var s = T.source, c = T.counts;
var st = Object.keys(c.static||{}).map(function(k){ return c.static[k].note+' ('+c.static[k].as_of+')'; });
return '<p class="provenance"><b>Where this comes from.</b> Toolkit text from <code>'+esc(s.repo)+'</code> at <code>'+esc(s.sha)+
'</code> ('+esc(s.date)+'), '+(s.merged?'merged':'pull request #'+s.pr+', <b>not yet merged</b>')+
'. Box numbers '+(c.source==='live'?'queried from this box’s own database on <b>'+esc(c.as_of)+'</b>':'from a <b>snapshot</b> dated '+esc(c.as_of))+
(st.length?'; one is not in the database: '+esc(st.join('; ')):'')+'.</p>';
}
function pageHead(k, title, lede){
return '<section class="front" style="padding:26px 28px">'+band()+
'<p class="eyebrow">'+esc(k)+'</p><h1 class="h-serif" style="font-size:clamp(24px,4vw,34px);margin-top:8px;max-width:26ch;line-height:1.1">'+esc(title)+'</h1>'+
'<p class="lede2" style="margin-top:12px">'+lede+'</p></section>';
}
function gapsBlock(){
return '<section><header class="grp-head"><h2>Records that do not exist yet</h2>'+
'<span class="t-faint">Checked against this box’s database at build time. A gap leaves this list by being built, not by being edited out.</span></header>'+
'<div class="gaps">'+T.gaps.map(function(g){
return '<div class="gap'+(g.exists?' built':'')+'"><div class="row" style="justify-content:space-between"><code>'+esc(g.name)+'</code>'+
'<span class="pill '+(g.exists?'yes':'no')+'">'+(g.exists?'exists':'not built')+'</span></div><p>'+esc(g.what)+'</p></div>';
}).join('')+'</div></section>';
}
function doors(){
var a = T.agreement, m = T.maturity;
var atStage0 = m.powers.filter(function(p){ return p.stage_n===0; }).length;
return '<section><header class="grp-head"><h2>The governance toolkit</h2>'+
'<span class="t-faint">The card’s four elements, crossed with the four scales at which a commons governs itself.</span></header>'+
'<div class="doors">'+
'<a class="door" href="#/scales"><span class="k">4 × 4</span><h3>Four scales</h3><p>Commons, community, action area, node — what each element means at each one.</p>'+
'<div class="foot"><span class="pill">16 cells</span></div></a>'+
'<a class="door" href="#/agreement"><span class="k">Reference document</span><h3>'+esc(a.title)+' '+esc(a.version)+'</h3><p>The working reference until a charter exists — and how it gets revised by the stewards who live under it.</p>'+
'<div class="foot"><span class="pill '+(a.tagged?'yes':'no')+'">'+(a.tagged?'tagged':'not yet tagged')+'</span><span class="pill open">'+a.redlines.waiting+' redlines waiting</span></div></a>'+
'<a class="door" href="#/maturity"><span class="k">Founding → exit to community</span><h3>Maturity plan</h3><p>Every power the founders hold, declared, with the next stage and the probe that would prove it moved.</p>'+
'<div class="foot"><span class="pill">'+m.powers.length+' powers</span><span class="pill">'+atStage0+' at stage 0</span><span class="pill no">'+m.defects.length+' defects</span></div></a>'+
'<a class="door" href="#/questions"><span class="k">Kept open on purpose</span><h3>Open questions</h3><p>What the toolkit has to test with stewards. None is for an engineer to settle.</p>'+
'<div class="foot"><span class="pill open">'+openCount()+' open</span></div></a>'+
'</div></section>'+gapsBlock();
}
/* ───────────── four scales × four elements ───────────── */
function renderScales(){
view.className = 'stack-sm';
var head = '<div class="corner"></div>'+D.elements.map(function(e){
return '<a class="ch" href="#/'+e.n+'" style="--acc:'+ACC[e.key]+';text-decoration:none"><b>'+esc(e.title)+'</b><i>'+esc(e.statement)+'</i></a>';
}).join('');
var rows = T.frame.map(function(s){
var node = s.name==='Node' ? ' node' : '';
return '<div class="row'+node+'"><div class="rh'+node+'"><b>'+esc(s.name)+'</b><span>'+esc(SCALE_GLOSS[s.name]||'')+'</span></div>'+
D.elements.map(function(e){
return '<div class="cell" style="--acc:'+ACC[e.key]+'"><span class="ek">'+esc(e.title)+'</span>'+s.cells[e.key]+'</div>';
}).join('')+'</div>';
}).join('');
view.innerHTML =
pageHead('The governance toolkit', 'Four elements, at four scales.',
'The card names what a community needs in order to govern itself. The AKC Charter draft names the scales it governs at, '+
'from the whole commons down to one box. The toolkit is where they cross — sixteen cells, most of which already have '+
'something in them. <b>Bold</b> marks what the Schneider, Smith and CROW research adds; the rest is work already on the box or on paper.')+
'<div class="frame">'+head+rows+'</div>'+
'<div class="card pad-lg" style="background:var(--card)"><p class="lede2" style="max-width:none">The research handoff proposed twelve new modules. '+
'Almost all of them already had a home in one of these cells, so they are folded in rather than built beside. '+
'The architecture line it proposed — card, constitution, agent, checks, sensors, seats — survives: it runs down the <b>Node</b> row, '+
'with the Charter above it as the constitution that constitutions answer to. The agent in the Node row is advisory, permanently: '+
'it writes opinions that cite a clause and it never acts or votes.</p></div>'+
sourceLine();
}
/* ───────────── the Steward's Agreement ───────────── */
function panel(title, items, acc, cls){
return '<div class="panel" style="--acc:'+acc+'"><h3>'+esc(title)+'</h3><ul>'+items.map(function(it){
return '<li'+(cls?' class="'+cls+'"':'')+'>'+(it.k?'<b>'+esc(it.k.charAt(0)+it.k.slice(1).toLowerCase())+'</b>':'')+esc(it.v)+'</li>';
}).join('')+'</ul></div>';
}
function renderAgreement(){
var a = T.agreement;
view.className = 'stack-sm';
var box = function(t){ return (a.boxes.filter(function(b){ return b.title===t; })[0]||{}).body||''; };
view.innerHTML =
'<section class="front" style="padding:26px 28px">'+band()+
'<div class="agr-head"><div>'+
'<p class="eyebrow">The working reference document</p>'+
'<h1 class="h-serif" style="font-size:clamp(26px,4.4vw,38px);margin-top:8px">'+esc(a.title)+' <span style="color:var(--teal)">'+esc(a.version)+'</span></h1>'+
'<p class="tagline" style="font-family:var(--serif);font-style:italic;color:var(--teal);font-size:18px;margin-top:10px">'+esc(a.tagline.charAt(0)+a.tagline.slice(1).toLowerCase())+'</p>'+
'<p class="lede2" style="margin-top:12px">No charter has been written or approved yet; the AKC Concordance charter draft is close to going out for review. '+
'Until it is, this is the document the rest of the toolkit anchors to — the governance card, each box’s local schedule, '+
'the maturity plan and what the advisory agent reads. It was adopted at a gathering. It has not had a full community review, '+
'and there is no versioning process yet. This page shows the text as the zine prints it, then where its revision stands.</p>'+
'<div class="status">'+
'<div><span class="k">Canonical source</span><div class="v">'+(a.tagged?'Tagged '+esc(a.version):'Not yet tagged')+'</div><div class="s">Tagging '+esc(a.version)+' as the baseline is for the stewards to affirm · '+qlink('A3')+'</div></div>'+
'<div><span class="k">Redlines</span><div class="v">'+a.redlines.waiting+' waiting · '+a.redlines.entered+' entered</div><div class="s">'+esc(a.redlines.note)+'</div></div>'+
'<div><span class="k">Decision rule</span><div class="v">Not yet declared</div><div class="s">Consent, consensus or supermajority — declared before any review window opens · '+qlink('A1')+'</div></div>'+
'<div><span class="k">Review window</span><div class="v">Not opened</div><div class="s">Length and languages still open · '+qlink('A2')+'</div></div>'+
'</div>'+
'</div>'+figure(1)+'</div>'+
'</section>'+
'<section><header class="grp-head"><h2>The text, as Field Zine #2 prints it</h2><span class="t-faint">'+esc(a.kicker)+' · '+esc(a.footer)+'</span></header>'+
'<div class="zine">'+
panel('The ritual — what you move through', a.ritual, 'var(--teal)')+
'<div class="panel" style="--acc:var(--teal)"><h3>The five questions</h3><p style="font-size:12.5px;color:var(--ink-faint);margin-top:6px">The setup does not finish until they are answered.</p><ul>'+
a.questions.map(function(q){ return '<li><b>'+esc(q.k.charAt(0)+q.k.slice(1).toLowerCase())+'</b>'+esc(q.v)+'</li>'; }).join('')+'</ul>'+
'<div class="aside" style="--acc:var(--sage)"><b>The first gift</b><p>'+esc(box('THE FIRST GIFT'))+'</p></div></div>'+
a.promise.map(function(g,i){ return panel(g.label, g.items, 'var(--clay)', i?'x':''); }).join('')+
a.back.map(function(g){ return '<div class="panel" style="--acc:var(--river)"><h3>'+esc(g.label)+'</h3><ul>'+g.items.map(function(it){
return '<li>'+(it.k?'<b>'+esc(it.k.charAt(0)+it.k.slice(1).toLowerCase())+'</b>':'')+esc(it.v)+'</li>'; }).join('')+'</ul>'+
'<div class="aside" style="--acc:var(--river)"><b>Promises need a promisor</b><p>'+esc(box('PROMISES NEED A PROMISOR'))+'</p></div></div>'; }).join('')+
panel('The security covenant — keep each other safe', a.covenant, 'var(--teal)')+
'<div class="panel" style="--acc:var(--sage)"><h3>What the box will not do</h3><div class="mantra">'+
a.will_not.map(function(w){ return '<span>'+esc(w)+'</span>'; }).join('')+'</div>'+
'<div class="aside" style="--acc:var(--sage)"><b>The only enforcement</b><p>'+esc(box('THE ONLY ENFORCEMENT'))+'</p></div>'+
'<div class="aside" style="--acc:var(--clay)"><b>How it is adopted</b><p>'+esc(a.adoption.join(' '))+'</p></div></div>'+
'</div></section>'+
'<section class="card pad-lg" style="background:var(--card)"><header class="sect-head" style="padding:0 0 12px;margin-bottom:4px">'+
'<h2>How it would be revised — proposed, not adopted</h2><span class="t-faint">From the toolkit exploration, §5a. This process is itself power P7 in the <a class="lnk" href="#/maturity">maturity plan</a>.</span></header>'+
'<ol class="steps">'+a.process.map(function(p){
return '<li>'+p.text+(p.sub.length?'<ul>'+p.sub.map(function(x){ return '<li>'+x+'</li>'; }).join('')+'</ul>':'')+'</li>';
}).join('')+'</ol>'+
'<p class="provenance" style="margin-top:12px">Open questions on this process: '+qlinks(T.questions[0].items.map(function(i){ return i.id; }))+'</p></section>'+
'<p class="provenance">'+esc(a.credits)+'</p>'+sourceLine();
}
/* ───────────── maturity: founding → exit to community ───────────── */
function track(n){
var h = '<div class="track" style="--stg:'+STAGE_C[n]+'">';
for (var i=0;i<5;i++) h += '<i class="'+(i<=n?'on':'')+(i===n?' here':'')+'"></i>';
return h+'</div><div class="tracklbl">'+T.maturity.stages.map(function(s){ return '<span>'+s.n+'</span>'; }).join('')+'</div>';
}
function renderMaturity(){
var m = T.maturity;
view.className = 'stack-sm';
view.innerHTML =
pageHead('From benevolent stewardship to exit to community', 'A power held on purpose, declared, with a way out.',
'A young network needs someone who can run servers, mint keys and cut releases. That stage is necessary, not a failure — '+
'and it is legitimate only while every power is <b>declared</b>, <b>bounded</b> by a next stage and a review date, and <b>checked</b> '+
'by the people who live under it. This replaces the feudalism audit; the full audit becomes the closing milestone, months off.')+
'<section><header class="grp-head"><h2>Position</h2></header><ol class="steps">'+m.position.map(function(p){ return '<li>'+p+'</li>'; }).join('')+'</ol></section>'+
'<section><header class="grp-head"><h2>The five stages</h2><span class="t-faint">A power moves up one stage at a time, with a capability transfer and a probe.</span></header>'+
'<div class="ladder">'+m.stages.map(function(s){
return '<div class="rung" style="--stg:'+STAGE_C[s.n]+'"><span class="n">STAGE '+s.n+'</span><b>'+esc(s.name)+'</b><p>'+s.means+'</p><p class="lg">'+s.legit+'</p></div>';
}).join('')+'</div></section>'+
'<section><header class="grp-head"><h2>Power Register — first draft</h2>'+
'<span class="t-faint">Public copy. Every row must be re-verified on the box before it circulates. No review dates are set and no probe has been run yet — both are shown, not hidden.</span></header>'+
m.powers.map(function(p){
return '<article class="power" style="--stg:'+STAGE_C[p.stage_n]+'"><div class="top"><span class="id">'+esc(p.id)+'</span><h3>'+p.power+'</h3></div>'+
'<div class="who">Held by: '+p.holder+' · Stage now: '+p.stage+'</div>'+track(p.stage_n)+
'<div class="cols"><div><span class="k">Next stage and criterion</span><p>'+p.next+'</p></div>'+
'<div><span class="k">Probe — verified by its effect, not a report</span><p>'+p.probe+'</p></div></div>'+
'<div class="meta"><span class="pill no">Review date: not set</span><span class="pill open">Probe: not yet run</span></div></article>';
}).join('')+
'<p class="provenance" style="margin-top:10px">Where the register lives, how often it is reviewed and who hears about emergency use: '+qlinks(['B1','B2','B3','B4','B5'])+'</p></section>'+
'<section class="defects"><h2>Defects — fixed now, never relabelled as a stage</h2>'+
'<p style="font-size:13px;color:var(--ink-soft);margin:6px 0 10px;line-height:1.6">A power held <i>deliberately</i> can mature in stages. One that exists by accident is a defect. '+
'Handing on admission to the network means nothing while admission can be forged, so these come first. The specific boxes and counts are kept in the internal copy.</p>'+
m.defects.map(function(d){
return '<div class="d"><b class="t">'+esc(d.id)+' · '+d.defect+'</b>'+d.why+'<br><b style="font-weight:600;color:var(--ink)">Fix:</b> '+d.fix+'</div>';
}).join('')+'</section>'+
'<section><header class="grp-head"><h2>Safeguards: how we know progress is legitimate</h2></header>'+
'<div class="guards">'+m.safeguards.map(function(g){ return '<div><b>'+g.title+'</b><p>'+g.text+'</p></div>'; }).join('')+'</div></section>'+
'<section class="card pad-lg" style="background:var(--card)"><header class="sect-head" style="padding:0 0 10px"><h2>What gets measured at every reaffirmation</h2></header>'+
'<ul style="margin:0;padding-left:18px">'+m.measures.map(function(x){ return '<li style="font-size:13.5px;line-height:1.7;color:var(--ink-soft)">'+x+'</li>'; }).join('')+'</ul></section>'+
'<section><header class="grp-head"><h2>Milestones</h2></header><div class="card" style="background:var(--card);padding:4px 8px"><div class="mil">'+
m.milestones.map(function(x){ return '<div>'+x.when+'</div><div>'+x.what+'</div>'; }).join('')+'</div></div></section>'+
sourceLine();
}
/* ───────────── open questions ───────────── */
function renderQuestions(focus){
view.className = 'stack-sm';
view.innerHTML =
pageHead('Kept open on purpose', openCount()+' questions the toolkit has to test.',
'Each is something the toolkit and the proposed architecture must try out with stewards. None is to be settled by an engineer. '+
'Every one names what would count as an answer and who gives it — and every one is still open.')+
T.questions.map(function(g){
return '<section class="qgroup"><header class="grp-head"><h2>'+esc(g.id)+'. '+esc(g.title)+'</h2></header><div class="qs">'+
g.items.map(function(q){
return '<article class="oq" id="q-'+esc(q.id)+'"><div class="top"><span class="id">'+esc(q.id)+'</span><span class="pill open">Open</span></div>'+
'<p class="q">'+q.q+'</p>'+
'<div><span class="k">How it gets tested</span><p class="v">'+q.test+'</p></div>'+
'<div><span class="k">Who answers</span><p class="v">'+q.who+'</p></div></article>';
}).join('')+'</div></section>';
}).join('')+sourceLine();
if (focus) {
var el = document.getElementById('q-'+focus);
if (el) { setTimeout(function(){ el.scrollIntoView({block:'center'}); el.style.borderColor='var(--corn)'; el.style.boxShadow='0 0 0 3px rgba(206,154,46,.25)'; }, 0); }
}
}
/* ───────────── router ───────────── */
function route(){
var h = (location.hash||'').replace(/^#\/?/,''), crumb = document.getElementById('crumb'), v = 'list';
var named = { scales:['Four scales',renderScales], agreement:['Steward’s Agreement',renderAgreement],
maturity:['Maturity plan',renderMaturity], questions:['Open questions',renderQuestions] };
var qm = /^questions\/([A-Z]\d+)$/.exec(h);
if (qm) { v='questions'; renderQuestions(qm[1]); crumb.innerHTML = '<a href="#/">CGO</a> › <a href="#/questions">Open questions</a> › <b>'+esc(qm[1])+'</b>'; }
else if (named[h]) { v=h; named[h][1](); crumb.innerHTML = '<a href="#/">CGO</a> › <b>'+esc(named[h][0])+'</b>'; }
else if (h === 'matrix') { v='matrix'; renderMatrix(); crumb.innerHTML = '<a href="#/">CGO</a> › <b>By hub</b>'; }
else if (/^[1-4]$/.test(h)) {
v='el'; renderElement(h);
crumb.innerHTML = '<a href="#/">CGO</a> › <b>'+esc(D.elements[+h-1].title)+'</b>';
} else { renderList(); crumb.innerHTML = '<b>CGO</b>'; }
document.querySelectorAll('#tabs a').forEach(function(a){
if (a.getAttribute('data-v') === v) a.setAttribute('aria-current','page'); else a.removeAttribute('aria-current');
});
var tl = { matrix:'By hub', scales:'Four scales', agreement:'Steward’s Agreement', maturity:'Maturity plan', questions:'Open questions' };
document.title = (tl[v]?tl[v]+' · ':v==='el'?D.elements[+h-1].title+' · ':'') + 'CGO — Farm Hack Box';
}
window.addEventListener('hashchange', function(){ route(); if (!/^#\/questions\//.test(location.hash)) window.scrollTo(0,0); });
route();
})();
</script>
</body>
</html>