-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathcross-language-results.html
More file actions
207 lines (192 loc) · 18.3 KB
/
Copy pathcross-language-results.html
File metadata and controls
207 lines (192 loc) · 18.3 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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cross-Language Scorecard Results (JS/TS + Go)</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: #0f1117; color: #e1e4e8; padding: 40px; min-height: 100vh; }
h1 { font-size: 26px; font-weight: 600; margin-bottom: 6px; color: #fff; }
.subtitle { color: #8b949e; margin-bottom: 36px; font-size: 14px; max-width: 1040px; line-height: 1.6; }
.wrap { max-width: 1240px; margin: 0 auto; }
code { font-family: 'SF Mono','Fira Code',monospace; background: #1f2937; padding: 1px 5px; border-radius: 3px; font-size: 0.92em; color: #e3b341; }
section { margin-bottom: 52px; }
section > h2 { font-size: 19px; font-weight: 600; color: #fff; margin-bottom: 6px; padding-bottom: 8px; border-bottom: 1px solid #30363d; }
section > .sec-note { font-size: 13px; color: #8b949e; margin: 10px 0 22px; line-height: 1.6; max-width: 1040px; }
/* hero */
.hero { display: flex; gap: 16px; flex-wrap: wrap; }
.hcard { flex: 1; min-width: 200px; border: 1px solid #30363d; border-radius: 12px; padding: 22px 24px; background: #161b22; text-align: center; }
.hcard .big { font-size: 52px; font-weight: 700; line-height: 1; color: #3fb950; }
.hcard .big small { font-size: 24px; color: #8b949e; font-weight: 500; }
.hcard .lab { font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 14px; color: #c9d1d9; }
.hcard .desc { font-size: 12px; color: #8b949e; margin-top: 10px; line-height: 1.5; }
.hcard.amber .big { color: #d29922; } .hcard.blue .big { color: #58a6ff; }
.cbox { position: relative; height: 300px; border: 1px solid #30363d; border-radius: 10px; background: #161b22; padding: 16px; }
table { border-collapse: collapse; width: 100%; font-size: 13px; }
.matrix th, .matrix td { border: 1px solid #30363d; padding: 7px 9px; text-align: center; }
.matrix th { background: #161b22; color: #8b949e; font-weight: 600; font-size: 12px; }
.matrix td.wt { text-align: left; font-family: 'SF Mono','Fira Code',monospace; font-size: 12px; color: #c9d1d9; background: #11151c; white-space: nowrap; }
.cell-win { background: rgba(63,185,80,0.14); color: #3fb950; }
.cell-loss { background: rgba(248,81,73,0.13); color: #f85149; font-weight: 600; }
.cell-tie { color: #687078; }
.cell-na { color: #444c56; }
.badge { font-size: 10px; font-weight: 700; padding: 2px 7px; border-radius: 10px; }
.b-green { background: rgba(63,185,80,0.16); color: #3fb950; }
.b-red { background: rgba(248,81,73,0.16); color: #f85149; }
.b-yes { background: rgba(63,185,80,0.16); color: #3fb950; font-weight: 700; }
.matrix tr.grp td { background: #0d1117; color: #6e7681; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; text-align: left; font-weight: 700; padding: 6px 9px; }
.gen { color: #e6edf3; font-weight: 600; } .base { color: #6e7681; }
.callout { border: 1px solid #5a3a1a; background: #2b1d0e; border-radius: 10px; padding: 16px 20px; }
.callout h3 { font-size: 14px; color: #e3b341; margin-bottom: 8px; }
.callout p { font-size: 13px; color: #c9b88a; line-height: 1.65; margin-bottom: 8px; }
.callout strong { color: #f0883e; }
.notes { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
@media (max-width: 900px){ .notes { grid-template-columns: 1fr; } .hcard { min-width: 140px; } }
.note { border: 1px solid #30363d; border-radius: 8px; padding: 16px; background: #161b22; }
.note h3 { font-size: 13px; color: #fff; margin-bottom: 8px; }
.note p, .note ul { font-size: 12px; color: #8b949e; line-height: 1.6; }
.note ul { padding-left: 16px; }
.footer { color: #586069; font-size: 11px; margin-top: 40px; border-top: 1px solid #21262d; padding-top: 16px; }
</style>
</head>
<body>
<div class="wrap">
<h1>Cross-Language Scorecard Results</h1>
<p class="subtitle">
Does scorecard-anchored prompting — which beat human baselines 9/9 in Python — generalize to other
languages? Six maintainer-written suites (<b>JS/TS:</b> express, jsonwebtoken, zod · <b>Go:</b> chi, gjson, golang-jwt),
each regenerated from scratch by Opus 4.8 under three iteration policies (oneshot / iter2 / iter20) = 18 arms,
scored gen-vs-baseline on the 8 auto-countable axes. Generated by autonomous subagents, one per git worktree.
</p>
<section>
<h2>Headline: the result generalizes — 18/18 arms beat their baseline</h2>
<p class="sec-note">An arm "beats baseline" when it wins more auto-countable axes than it loses. Every arm does,
across two new languages and six independent suites.</p>
<div class="hero">
<div class="hcard"><div class="lab">All arms</div><div class="big" id="h-all">–<small>/18</small></div><div class="desc">beat baseline on net axes</div></div>
<div class="hcard blue"><div class="lab">JS / TS</div><div class="big" id="h-js">–<small>/9</small></div><div class="desc">express · jsonwebtoken · zod</div></div>
<div class="hcard blue"><div class="lab">Go</div><div class="big" id="h-go">–<small>/9</small></div><div class="desc">chi · gjson · golang-jwt</div></div>
<div class="hcard amber"><div class="lab">Oneshot green</div><div class="big" id="h-os">–<small>/6</small></div><div class="desc">win the axes but ship 1–4 self-authored failures</div></div>
<div class="hcard"><div class="lab">Iterative green</div><div class="big" id="h-it">–<small>/12</small></div><div class="desc">iter2 + iter20 — iteration's value is correctness</div></div>
</div>
</section>
<section>
<h2>Where the wins come from — and the one axis that loses</h2>
<p class="sec-note">Win / tie / loss across all 18 arms, per axis. <b>D.1 (LOC efficiency) and D.2 (parametrization)
are won by every arm.</b> A.1/A.2 win wherever the baseline has fragility to beat. A.4/A.5/C.1 are mostly
ties at the optimal floor of 0. <b>Every loss in the whole run is B.1</b> — see the caveat below.</p>
<div class="cbox"><canvas id="axisChart"></canvas></div>
</section>
<section>
<h2>Every arm, every axis</h2>
<p class="sec-note">Cell = <span class="gen">gen</span> vs <span class="base">base</span>.
<span class="cell-win">green = win</span> · <span class="cell-loss">red = loss</span> ·
gray = tie · <code>·</code> = n/a (A.2 is idiomatic in Go). Directions: A.1/A.2/A.4/A.5/C.1/D.1 lower-better;
B.1/D.2 higher-better.</p>
<table class="matrix" id="matrix"></table>
</section>
<section>
<h2>The caveat: B.1 is the wrong shape (an absolute count that fights D.1)</h2>
<div class="callout">
<p><strong>Every loss across all 18 arms is B.1 (fixed-vector count), and nothing else.</strong> Three causes,
only one a real quality gap:</p>
<p><strong>1. Size-scaling.</strong> B.1 is a raw count, so it tracks suite size. zod's baseline is 1941 tests
with <strong>914</strong> inline-snapshot vectors; a clean 281-test generated suite tops out at 154 and
<em>cannot</em> catch it without ~800 padding asserts — which would regress the D.1 win it already holds.
B.1 (absolute) is in direct opposition to D.1 (LOC efficiency): you can't maximize both. The agents correctly
refused to pad.</p>
<p><strong>2. JS idiom under-counting.</strong> The JS B.1 regex misses supertest <code>.expect(status, body)</code>,
<code>it.each</code> table rows, and object deep-equals — so fixed-vector-dense oneshot suites read B.1 ≈ 3–4.
(The Go table-driven idiom <code>got != tc.want</code> was caught and fixed before the run.)</p>
<p><strong>3. Genuine:</strong> a smaller suite does have fewer distinct fixed vectors.</p>
<p><strong>Proposed fix:</strong> make B.1 a <strong>per-test ratio</strong> (like D.2) instead of an
absolute count, and extend the JS profile to count framework-matcher vectors. See FINDINGS §17.</p>
</div>
</section>
<section>
<h2>Reading notes</h2>
<div class="notes">
<div class="note">
<h3>Policy split: oneshot wins axes, iteration ships</h3>
<p>All 6 oneshot arms beat the baseline on net axes but ended <span class="b-red badge">RED</span> — 1–4
self-authored expected-value bugs, left unrepaired per the no-second-pass rule (none were framework bug-finds).
All 12 iterative arms ended <span class="b-green badge">GREEN</span>. The first repair pass is what makes a
strong-but-broken suite shippable.</p>
</div>
<div class="note">
<h3>Integrity held at scale</h3>
<p>Across 18 autonomous runs (2.66M tokens): zero recovered deleted tests from git, zero read baseline test
bodies — self-reported and spot-checked (clean delete→generate git shapes, per-iteration commit histories,
and suites that diverge structurally from baselines, e.g. express 91 files/1128 tests → 15/183, which a
git-restore cheat could not produce).</p>
</div>
<div class="note">
<h3>Scorer calibrated before generation</h3>
<p>Two language blind spots were fixed first: the JS profile (Mocha+Chai / node:assert idioms read ~0 on
A.1/B.1) and — surfaced by a one-arm Go pilot — the Go B.1 table-driven idiom (gjson 0 → 20). A heuristic
regex scorer must be calibrated against real suites per language before its numbers mean anything.</p>
</div>
<div class="note">
<h3>Methodology</h3>
<p>Model held fixed at Opus 4.8 (from the Python experiment) so this isolates the language axis. Authoritative scores are an
independent recompute (<code>scripts/score_cross_language.py</code>) over the persisted worktrees, not the agents'
self-scores. D.2 baselines are near-zero because the human suites rarely use framework table-runners.</p>
</div>
</div>
</section>
<div class="footer">
Generated from <code>results-cross-language-scorecard.json</code> + the cross-language generation workflow ·
18 arms · 6 repos × {oneshot, iter2, iter20} · Opus 4.8 · scored by the multi-language <code>test-quality</code> scorer.
</div>
</div>
<script>
const ARMS = [{"repo":"express","policy":"oneshot","lang":"js","green":false,"passed":150,"failed":4,"tc":117,"loc":1073,"w":4,"l":1,"t":3,"better":true,"ax":{"A1":[0,25,"WIN"],"A2":[0,2,"WIN"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[3,28,"LOSS"],"D1":[9.17,14.57,"WIN"],"D2":[0.179,0.0,"WIN"]}},{"repo":"express","policy":"iter2","lang":"js","green":true,"passed":220,"failed":0,"tc":160,"loc":1768,"w":5,"l":0,"t":3,"better":true,"ax":{"A1":[0,25,"WIN"],"A2":[0,2,"WIN"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[30,28,"WIN"],"D1":[11.05,14.57,"WIN"],"D2":[0.194,0.0,"WIN"]}},{"repo":"express","policy":"iter20","lang":"js","green":true,"passed":232,"failed":0,"tc":183,"loc":1784,"w":5,"l":0,"t":3,"better":true,"ax":{"A1":[0,25,"WIN"],"A2":[0,2,"WIN"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[34,28,"WIN"],"D1":[9.75,14.57,"WIN"],"D2":[0.12,0.0,"WIN"]}},{"repo":"jsonwebtoken","policy":"oneshot","lang":"js","green":false,"passed":97,"failed":1,"tc":66,"loc":612,"w":4,"l":1,"t":3,"better":true,"ax":{"A1":[0,15,"WIN"],"A2":[0,0,"TIE"],"A4":[0,1,"WIN"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[4,21,"LOSS"],"D1":[9.27,15.02,"WIN"],"D2":[0.258,0.0,"WIN"]}},{"repo":"jsonwebtoken","policy":"iter2","lang":"js","green":true,"passed":99,"failed":0,"tc":88,"loc":722,"w":5,"l":0,"t":3,"better":true,"ax":{"A1":[0,15,"WIN"],"A2":[0,0,"TIE"],"A4":[0,1,"WIN"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[25,21,"WIN"],"D1":[8.2,15.02,"WIN"],"D2":[0.136,0.0,"WIN"]}},{"repo":"jsonwebtoken","policy":"iter20","lang":"js","green":true,"passed":98,"failed":0,"tc":69,"loc":685,"w":5,"l":0,"t":3,"better":true,"ax":{"A1":[0,15,"WIN"],"A2":[0,0,"TIE"],"A4":[0,1,"WIN"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[22,21,"WIN"],"D1":[9.93,15.02,"WIN"],"D2":[0.232,0.0,"WIN"]}},{"repo":"zod","policy":"oneshot","lang":"js","green":false,"passed":380,"failed":1,"tc":140,"loc":1111,"w":4,"l":1,"t":3,"better":true,"ax":{"A1":[0,69,"WIN"],"A2":[0,497,"WIN"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[19,914,"LOSS"],"D1":[7.94,19.1,"WIN"],"D2":[0.421,0.0,"WIN"]}},{"repo":"zod","policy":"iter2","lang":"js","green":true,"passed":326,"failed":0,"tc":129,"loc":850,"w":4,"l":1,"t":3,"better":true,"ax":{"A1":[0,69,"WIN"],"A2":[0,497,"WIN"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[82,914,"LOSS"],"D1":[6.59,19.1,"WIN"],"D2":[0.078,0.0,"WIN"]}},{"repo":"zod","policy":"iter20","lang":"js","green":true,"passed":737,"failed":0,"tc":281,"loc":2600,"w":4,"l":1,"t":3,"better":true,"ax":{"A1":[0,69,"WIN"],"A2":[0,497,"WIN"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[154,914,"LOSS"],"D1":[9.25,19.1,"WIN"],"D2":[0.114,0.0,"WIN"]}},{"repo":"chi","policy":"oneshot","lang":"go","green":false,"passed":50,"failed":3,"tc":53,"loc":1364,"w":2,"l":1,"t":4,"better":true,"ax":{"A1":[0,0,"TIE"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[36,147,"LOSS"],"D1":[25.74,53.67,"WIN"],"D2":[0.547,0.369,"WIN"]}},{"repo":"chi","policy":"iter2","lang":"go","green":true,"passed":60,"failed":0,"tc":60,"loc":1987,"w":3,"l":0,"t":4,"better":true,"ax":{"A1":[0,0,"TIE"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[148,147,"WIN"],"D1":[33.12,53.67,"WIN"],"D2":[0.817,0.369,"WIN"]}},{"repo":"chi","policy":"iter20","lang":"go","green":true,"passed":419,"failed":0,"tc":116,"loc":3423,"w":2,"l":1,"t":4,"better":true,"ax":{"A1":[0,0,"TIE"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[107,147,"LOSS"],"D1":[29.51,53.67,"WIN"],"D2":[0.871,0.369,"WIN"]}},{"repo":"gjson","policy":"oneshot","lang":"go","green":false,"passed":44,"failed":1,"tc":45,"loc":904,"w":2,"l":0,"t":5,"better":true,"ax":{"A1":[0,0,"TIE"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[20,20,"TIE"],"D1":[20.09,28.16,"WIN"],"D2":[1.067,0.02,"WIN"]}},{"repo":"gjson","policy":"iter2","lang":"go","green":true,"passed":39,"failed":0,"tc":39,"loc":1010,"w":3,"l":0,"t":4,"better":true,"ax":{"A1":[0,0,"TIE"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[33,20,"WIN"],"D1":[25.9,28.16,"WIN"],"D2":[0.795,0.02,"WIN"]}},{"repo":"gjson","policy":"iter20","lang":"go","green":true,"passed":81,"failed":0,"tc":81,"loc":1742,"w":3,"l":0,"t":4,"better":true,"ax":{"A1":[0,0,"TIE"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[89,20,"WIN"],"D1":[21.51,28.16,"WIN"],"D2":[1.111,0.02,"WIN"]}},{"repo":"golang-jwt","policy":"oneshot","lang":"go","green":false,"passed":30,"failed":1,"tc":30,"loc":1072,"w":4,"l":0,"t":3,"better":true,"ax":{"A1":[0,1,"WIN"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[24,16,"WIN"],"D1":[35.73,78.0,"WIN"],"D2":[1.067,0.378,"WIN"]}},{"repo":"golang-jwt","policy":"iter2","lang":"go","green":true,"passed":41,"failed":0,"tc":41,"loc":1129,"w":4,"l":0,"t":3,"better":true,"ax":{"A1":[0,1,"WIN"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[20,16,"WIN"],"D1":[27.54,78.0,"WIN"],"D2":[1.098,0.378,"WIN"]}},{"repo":"golang-jwt","policy":"iter20","lang":"go","green":true,"passed":69,"failed":0,"tc":69,"loc":2114,"w":4,"l":0,"t":3,"better":true,"ax":{"A1":[0,1,"WIN"],"A2":[null,null,"N/A"],"A4":[0,0,"TIE"],"A5":[0,0,"TIE"],"C1":[0,0,"TIE"],"B1":[46,16,"WIN"],"D1":[30.64,78.0,"WIN"],"D2":[0.928,0.378,"WIN"]}}];
const AXES = ['A1','A2','A4','A5','C1','B1','D1','D2'];
const AXFULL = {A1:'substring',A2:'private',A4:'recomputed',A5:'or-joined',C1:'mock_real',B1:'fixed-vec',D1:'loc/test',D2:'param'};
const fmt = v => v===null ? '·' : (Number.isInteger(v) ? ''+v : (+v).toFixed(2));
// hero stats
const better = ARMS.filter(a=>a.better).length;
const js = ARMS.filter(a=>a.lang==='js'&&a.better).length;
const go = ARMS.filter(a=>a.lang==='go'&&a.better).length;
const osGreen = ARMS.filter(a=>a.policy==='oneshot'&&a.green).length;
const itGreen = ARMS.filter(a=>a.policy!=='oneshot'&&a.green).length;
document.getElementById('h-all').innerHTML = better+'<small>/18</small>';
document.getElementById('h-js').innerHTML = js+'<small>/9</small>';
document.getElementById('h-go').innerHTML = go+'<small>/9</small>';
document.getElementById('h-os').innerHTML = osGreen+'<small>/6</small>';
document.getElementById('h-it').innerHTML = itGreen+'<small>/12</small>';
// axis distribution chart
const dist = AXES.map(a => { let w=0,l=0,t=0,n=0; ARMS.forEach(arm=>{const v=arm.ax[a][2]; if(v==='WIN')w++;else if(v==='LOSS')l++;else if(v==='TIE')t++;else n++;}); return {w,l,t,n}; });
new Chart(document.getElementById('axisChart'), {
type: 'bar',
data: { labels: AXES.map(a=>a+' '+AXFULL[a]),
datasets: [
{ label:'win', data:dist.map(d=>d.w), backgroundColor:'#3fb950' },
{ label:'tie', data:dist.map(d=>d.t), backgroundColor:'#444c56' },
{ label:'loss', data:dist.map(d=>d.l), backgroundColor:'#f85149' },
{ label:'n/a', data:dist.map(d=>d.n), backgroundColor:'#21262d' },
] },
options: { responsive:true, maintainAspectRatio:false,
scales: { x:{stacked:true, ticks:{color:'#8b949e',font:{size:11}}, grid:{color:'#21262d'}},
y:{stacked:true, max:18, ticks:{color:'#8b949e',stepSize:3}, grid:{color:'#21262d'}, title:{display:true,text:'arms (of 18)',color:'#8b949e'}} },
plugins: { legend:{labels:{color:'#c9d1d9',boxWidth:12}} } }
});
// matrix
const m = document.getElementById('matrix');
let h = '<thead><tr><th>repo / policy</th><th>lang</th><th>suite</th>'+AXES.map(a=>'<th>'+a+'</th>').join('')+'<th>W/L/T</th><th>better</th></tr></thead><tbody>';
let lastRepo = null;
ARMS.forEach(a => {
if (a.repo !== lastRepo) { h += '<tr class="grp"><td colspan="'+(AXES.length+5)+'">'+a.repo+'</td></tr>'; lastRepo = a.repo; }
const cls = v => v==='WIN'?'cell-win':v==='LOSS'?'cell-loss':v==='N/A'?'cell-na':'cell-tie';
const cells = AXES.map(ax => { const [g,b,v]=a.ax[ax]; return '<td class="'+cls(v)+'">'+fmt(g)+'<span class="base">v'+fmt(b)+'</span></td>'; }).join('');
const suite = (a.green?'<span class="badge b-green">GREEN '+a.passed+'</span>':'<span class="badge b-red">RED '+a.passed+'/'+a.failed+'✗</span>');
h += '<tr><td class="wt">'+a.policy+'</td><td>'+a.lang+'</td><td>'+suite+'</td>'+cells+'<td>'+a.w+'/'+a.l+'/'+a.t+'</td><td><span class="badge b-yes">yes</span></td></tr>';
});
h += '</tbody>';
m.innerHTML = h;
</script>
</body>
</html>