1{{/*2 volume — one volume measured.34 The headline is the score and how it moved, because that is what the gate5 reads (docs/enrich.md). Under it, every build in full: what each world is6 worth, the five absolute axes as diagnostics, and the whole of every ledger7 the payloads carry — every held feature with its reason, every adoption,8 every correction. A count is a summary; this page is the account.9*/}}10{{define "title"}}{{.Volume.Title}}{{end}}11{{define "content"}}12{{$volume := .Volume}}13<section class="page-head">14 <h1>{{.Volume.Title}} <span class="dim">{{.Volume.Slug}}</span></h1>15 <p class="dim">{{len .Volume.Builds}} builds, newest first — the first is the one a reader is given.</p>16</section>1718<section class="headline">19 <p class="score-big">{{.Volume.Serving.Total}}<span class="dim"> points · point table v{{.Table}}</span></p>20 {{with .Movement}}21 {{if .Comparable}}22 <p class="movement {{if gt .Delta 0}}delta-up{{else if lt .Delta 0}}delta-down{{else}}delta-flat{{end}}">23 {{if gt .Delta 0}}+{{end}}{{.Delta}} against the build before it ({{.Before}} → {{.After}})</p>24 {{if lt .Delta 0}}25 <p class="dim">The ledger accounts for {{.Allowance}} of the decline.26 {{range .Reasons}}<span class="badge">{{.}}</span>{{end}}</p>27 {{end}}28 {{else}}29 <p class="movement dim">The build before it was scored under another point table; nothing is concluded.</p>30 {{end}}31 {{else}}<p class="movement dim">The only build of this volume.</p>{{end}}32</section>3334{{if gt (len .Volume.Builds) 1}}35<form class="compare" action="/volume/{{.Volume.Slug}}/diff" method="get">36 <label for="build-a">compare</label>37 <select id="build-a" name="a">38 {{range $at, $build := .Volume.Builds}}<option value="{{$build.File}}"{{if eq $at 1}} selected{{end}}>{{$build.File}}</option>{{end}}39 </select>40 <label for="build-b">against</label>41 <select id="build-b" name="b">42 {{range $at, $build := .Volume.Builds}}<option value="{{$build.File}}"{{if eq $at 0}} selected{{end}}>{{$build.File}}</option>{{end}}43 </select>44 <button>What moved</button>45</form>46{{end}}4748{{range $at, $build := .Volume.Builds}}49<section class="build{{if eq $at 0}} serving{{end}}">50 <h2>{{$build.File}}{{if eq $at 0}} <span class="tag">serving</span>{{end}}</h2>51 <p class="dim">captured {{$build.CreatedAt}} · revision {{$build.Revision}} · stamp {{short $build.Stamp}}52 {{if $build.Enriched}} · enriched under policy {{$build.EnrichPolicy}}{{end}}</p>53 <p class="score">{{$build.Total}} points <span class="dim">table v{{$build.TableVersion}}</span></p>5455 <table class="worlds">56 <thead><tr>57 <th>world</th><th class="num">score</th><th class="num">features</th>58 <th class="num">collections</th><th class="num">world</th>59 </tr></thead>60 <tbody>61 {{range $build.Worlds}}62 <tr><td>{{.Slug}}</td><td class="num score">{{.Total}}</td><td class="num">{{.Features}}</td>63 <td class="num">{{.Collections}}</td><td class="num">{{.World}}</td></tr>64 {{end}}65 </tbody>66 </table>6768 <h3 class="axes-head">Diagnostics <span class="dim">the five absolute axes; nothing gates on them</span></h3>69 <dl class="axes">70 <div><dt>annotation</dt><dd><b>{{$build.Axes.Points}}</b> point features of {{$build.Axes.Features}} in all ·71 {{$build.Axes.Described}} described ({{$build.Axes.DescribedShare}}) · median {{$build.Axes.MedianLength}} chars</dd></div>72 <div><dt>cartography</dt><dd><b>{{$build.Axes.TileCount}}</b> tiles · {{$build.Axes.RasterMB}} MB unique raster ·73 depth z{{$build.Axes.Depth}} holds {{$build.Axes.DepthTiles}} tiles</dd></div>74 <div><dt>structure</dt><dd><b>{{$build.Axes.Collections}}</b> collections in {{$build.Axes.Groups}} groups ·75 {{$build.Axes.TextSets}} text label sets · {{$build.Axes.Shapes}} shapes ({{$build.Axes.Vertices}} vertices) ·76 {{$build.Axes.Lenses}} lenses</dd></div>77 <div><dt>icons</dt><dd><b>{{$build.Axes.IconsCarried}}</b> of {{$build.Axes.IconsWanted}} marker collections78 carry one ({{$build.Axes.IconShare}})</dd></div>79 <div><dt>conventions</dt><dd>80 {{if $build.Axes.Conventions}}<b>v{{$build.Axes.Conventions}}</b> · {{$build.Axes.RenderShare}} of collections81 declare their rendering · geometry {{$build.Axes.Geometry}}82 {{if $build.Axes.StdIcons}} · {{$build.Axes.StdIcons}} standard icons{{end}}83 {{if $build.Axes.GeoFeatures}} · {{$build.Axes.GeoFeatures}} features carry true coordinates{{end}}84 {{if $build.Axes.Memberships}} · {{$build.Axes.Memberships}} memberships joined{{end}}85 {{if $build.Axes.UnknownAttrs}} · {{$build.Axes.UnknownAttrs}} attributes this build does not know{{end}}86 {{else}}none declared (pre-conventions build){{end}}</dd></div>87 </dl>8889 {{if $build.Ledger}}90 <h3>Ledger <span class="dim">every reading this build carries</span></h3>91 <table class="ledger">92 <thead><tr>93 <th>world</th><th>reading</th><th class="num">offered</th><th class="num">matched</th>94 <th class="num">median px</th><th class="num">enriched</th><th class="num">added</th>95 <th class="num">adopted</th><th class="num">held</th><th class="num">rejected</th><th>alignment</th>96 </tr></thead>97 <tbody>98 {{range $build.Ledger}}99 <tr>100 <td>{{.World}}</td>101 <td>{{.Account.Source}}{{if .Account.Origin}} <span class="tag">origin</span>{{end}}</td>102 <td class="num">{{.Account.DonorFeatures.Total}}103 <span class="dim">{{.Account.DonorFeatures.Point}}p/{{.Account.DonorFeatures.Path}}l/{{.Account.DonorFeatures.Area}}a</span></td>104 <td class="num">{{.Account.MatchedN}}</td>105 <td class="num">{{.Account.MedianMatchPx}}</td>106 <td class="num">{{.Account.EnrichedN}}</td>107 <td class="num">{{.Account.Added}}</td>108 <td class="num">{{.Account.AdoptedN}}</td>109 <td class="num">{{.Account.HeldN}}</td>110 <td class="num">{{.Account.RejectedN}}</td>111 <td class="dim">{{.Account.Alignment}}</td>112 </tr>113 {{end}}114 </tbody>115 </table>116117 {{range $build.Ledger}}118 {{if .Account.Held}}119 <details class="account">120 <summary>{{.Account.Source}} · {{.World}} — {{.Account.HeldN}} features held back</summary>121 <table>122 <thead><tr><th class="num">donor id</th><th>title</th><th>reason</th></tr></thead>123 <tbody>{{range .Account.Held}}<tr><td class="num">{{.Donor}}</td><td>{{.Title}}</td><td class="dim">{{.Reason}}</td></tr>{{end}}</tbody>124 </table>125 </details>126 {{end}}127 {{if .Account.Rejected}}128 <details class="account">129 <summary>{{.Account.Source}} · {{.World}} — {{.Account.RejectedN}} features rejected</summary>130 <table>131 <thead><tr><th class="num">donor id</th><th>title</th><th>reason</th></tr></thead>132 <tbody>{{range .Account.Rejected}}<tr><td class="num">{{.Donor}}</td><td>{{.Title}}</td><td class="dim">{{.Reason}}</td></tr>{{end}}</tbody>133 </table>134 </details>135 {{end}}136 {{if .Account.Adopted}}137 <details class="account">138 <summary>{{.Account.Source}} · {{.World}} — {{.Account.AdoptedN}} features adopted into this world's own collections</summary>139 <table>140 <thead><tr><th class="num">donor id</th><th>into</th></tr></thead>141 <tbody>{{range .Account.Adopted}}<tr><td class="num">{{.Donor}}</td><td>{{.Into}}</td></tr>{{end}}</tbody>142 </table>143 </details>144 {{end}}145 {{if .Account.Enriched}}146 <details class="account">147 <summary>{{.Account.Source}} · {{.World}} — collections that took an attribute</summary>148 <table>149 <thead><tr><th>collection</th><th>key</th></tr></thead>150 <tbody>{{range .Account.Enriched}}<tr><td>{{.Collection}}</td><td class="dim">{{.Key}}</td></tr>{{end}}</tbody>151 </table>152 </details>153 {{end}}154 {{if .Account.Corrections}}155 <details class="account" open>156 <summary>{{.Account.Source}} · {{.World}} — corrections</summary>157 <table>158 <thead><tr><th>world</th><th>reason</th><th class="num">points</th></tr></thead>159 <tbody>{{range .Account.Corrections}}<tr><td>{{.World}}</td><td>{{.Reason}}</td><td class="num">{{.Points}}</td></tr>{{end}}</tbody>160 </table>161 </details>162 {{end}}163 {{end}}164 {{else}}165 <p class="dim">This build carries no ledger: nothing was folded into it.</p>166 {{end}}167</section>168{{end}}169{{end}}