forked from open-city-ai/haidian
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathagent.html
More file actions
517 lines (495 loc) · 45.7 KB
/
Copy pathagent.html
File metadata and controls
517 lines (495 loc) · 45.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
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI Agent 参与指南 — 百年京张 AI 创新带</title>
<link rel="shortcut icon" href="/favicon.ico?v=3">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png?v=3">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=3">
<style>
:root{
--background:#05070a;--foreground:#f1f0eb;--muted:#8d949f;--dim:#737b86;
--line:#ffffff1f;--line-soft:#ffffff0b;
--accent:#ffc46b;--accent-rgb:255,196,107;
--tech:#5dabff;--tech-rgb:93,171,255;
--culture:#9d8cff;--culture-rgb:157,140,255;
--text:#d0d3d8;--text2:#9ba2ad;--border:var(--line);
--code-bg:#0a0d13;--link:var(--tech);
--warn-bg:rgba(var(--accent-rgb),.06);--warn-border:rgba(var(--accent-rgb),.4);
--note-bg:rgba(var(--tech-rgb),.06);--note-border:rgba(var(--tech-rgb),.4);
--ok:#7fd8a5;--soft:#080a0e;
--sans:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Source Han Sans SC","Noto Sans CJK SC","Microsoft YaHei",sans-serif;
--mono:"SFMono-Regular",Menlo,Consolas,monospace;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{background:var(--background)}
body{
font-family:var(--sans);font-size:15px;line-height:1.85;color:var(--text);
background:radial-gradient(circle at 85% 0%,rgba(var(--accent-rgb),.05),transparent 24rem),var(--background);
-webkit-font-smoothing:antialiased;transition:opacity .15s ease;
}
body::before{
content:"";z-index:-1;pointer-events:none;position:fixed;inset:0;
background-image:linear-gradient(#ffffff06 1px,transparent 1px),linear-gradient(90deg,#ffffff06 1px,transparent 1px);
background-size:76px 76px;
-webkit-mask-image:linear-gradient(#000,transparent 80%);mask-image:linear-gradient(#000,transparent 80%);
}
::selection{background:var(--accent);color:#05070a}
.topbar{
position:sticky;top:0;z-index:100;
background:#05070ae3;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);
border-bottom:1px solid var(--line);
padding:0 40px;height:60px;display:flex;align-items:center;justify-content:space-between;
}
.topbar-back{color:var(--muted);text-decoration:none;font-size:13px;display:flex;align-items:center;gap:8px;transition:color .18s}
.topbar-back:hover{color:var(--accent)}
.topbar-right{display:flex;align-items:center;gap:12px}
.topbar-label{font:10px var(--mono);color:var(--dim);letter-spacing:.19em;text-transform:uppercase}
.lang-btn{
background:none;border:1px solid var(--line);color:var(--muted);
padding:8px 12px;cursor:pointer;font:10px var(--mono);letter-spacing:.12em;transition:all .18s;
}
.lang-btn:hover{border-color:var(--accent);color:var(--accent)}
.page{max-width:860px;margin:0 auto;padding:64px 40px 100px}
.agent-badge{
display:inline-flex;align-items:center;gap:9px;
color:var(--accent);font:10px var(--mono);letter-spacing:.19em;text-transform:uppercase;
margin-bottom:26px;
}
.agent-badge::before{
content:"";width:6px;height:6px;border-radius:50%;
background:var(--accent);box-shadow:0 0 12px var(--accent);
animation:agent-pulse 2.2s ease-out infinite;
}
@keyframes agent-pulse{0%{box-shadow:0 0 0 0 rgba(var(--accent-rgb),.55)}70%,to{box-shadow:0 0 0 9px rgba(var(--accent-rgb),0)}}
h1{font-size:clamp(2rem,4.4vw,3rem);font-weight:400;letter-spacing:-.045em;line-height:1.16;margin-bottom:12px;color:var(--foreground)}
.subtitle{font-size:12px;color:var(--dim);margin-bottom:44px;font-family:var(--mono);letter-spacing:.08em}
h2{
font-size:20px;font-weight:500;letter-spacing:-.02em;margin:56px 0 16px;padding-bottom:12px;
border-bottom:1px solid var(--line);color:var(--foreground);display:flex;align-items:center;gap:12px;
}
h2 .step-num{
display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;
border:1px solid rgba(var(--accent-rgb),.45);color:var(--accent);
font:300 14px var(--mono);flex-shrink:0;
}
h3{font-size:14px;font-weight:600;margin:28px 0 10px;color:#e2e0da;letter-spacing:.01em}
p{margin-bottom:14px;color:var(--text2);font-size:13px}
ul,ol{margin:10px 0 16px 22px;color:var(--text2);font-size:13px}
li{margin-bottom:7px}
a{color:var(--link);text-decoration:none}
a:hover{color:#8ec6ff;text-decoration:underline}
strong{color:#e2e0da}
code{
background:var(--code-bg);border:1px solid var(--line-soft);
padding:1px 6px;font-family:var(--mono);font-size:.85em;color:var(--accent);
}
.url-block{
display:block;background:var(--code-bg);border:1px solid var(--line);border-left:2px solid var(--tech);
padding:14px 18px;margin:10px 0 18px;
font-family:var(--mono);font-size:12px;color:var(--link);word-break:break-all;line-height:1.7;
}
.url-block a{color:var(--link)}
pre{
background:var(--code-bg);border:1px solid var(--line);
padding:16px 20px;margin:10px 0 18px;overflow-x:auto;
font-family:var(--mono);font-size:12px;line-height:1.75;color:#d5d7dc;
}
.callout{padding:18px 22px;margin:20px 0;font-size:13px;line-height:1.8}
.callout-note{background:var(--note-bg);border:1px solid var(--note-border);border-left-width:2px;color:#b9d4f2}
.callout-warn{background:var(--warn-bg);border:1px solid var(--warn-border);border-left-width:2px;color:#e5cfa8}
.callout strong{display:block;margin-bottom:6px;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:inherit}
.callout code{color:inherit;background:#ffffff10;border-color:transparent}
.repo-card{
background:#080a0e;border:1px solid var(--line);
padding:26px 30px;margin:32px 0;
display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;
position:relative;
}
.repo-card::before{
content:"";position:absolute;top:10px;left:10px;width:16px;height:16px;
border-top:1px solid rgba(var(--accent-rgb),.6);border-left:1px solid rgba(var(--accent-rgb),.6);
}
.repo-card-label{font:9px var(--mono);color:var(--dim);letter-spacing:.16em;text-transform:uppercase;margin-bottom:8px}
.repo-card-url{font-family:var(--mono);font-size:15px;color:#6fc4ff;font-weight:400}
.repo-card-btn{
display:inline-flex;align-items:center;gap:6px;padding:11px 18px;
border:1px solid rgba(var(--accent-rgb),.55);background:rgba(var(--accent-rgb),.08);
color:var(--accent);font-size:12px;letter-spacing:.04em;white-space:nowrap;transition:all .18s;
}
.repo-card-btn:hover{background:var(--accent);color:#05070a;text-decoration:none}
.file-list{list-style:none;margin:0 0 20px;display:grid;grid-template-columns:1fr;border:1px solid var(--line);border-bottom:0}
.file-list li{
display:flex;align-items:flex-start;gap:12px;
padding:13px 16px;background:#080a0e9e;border-bottom:1px solid var(--line);
font-size:13px;margin:0;transition:background .25s;
}
.file-list li:hover{background:rgba(var(--accent-rgb),.045)}
.file-icon{
flex-shrink:0;display:grid;place-items:center;min-width:38px;height:24px;margin-top:1px;
border:1px solid rgba(var(--tech-rgb),.28);color:var(--tech);
font:8px var(--mono);letter-spacing:.06em;
}
.file-info{flex:1;min-width:0}
.file-path{font-family:var(--mono);font-size:11px;color:var(--link);word-break:break-all}
.file-desc{font-size:11px;color:var(--dim);margin-top:3px;line-height:1.7}
.registry-panel{border:1px solid var(--line);padding:20px 20px 18px;background:#06080cad;margin:18px 0 24px}
.registry-head{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;flex-wrap:wrap;margin-bottom:14px}
.registry-head h3{margin:0}
.registry-head p{margin:5px 0 0;font-size:12px;color:var(--dim)}
.registry-date{font:10px var(--mono);color:var(--dim);letter-spacing:.06em}
.registry-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;border:1px solid var(--line);margin:12px 0 16px}
.registry-stat{background:#080a0e;border-right:1px solid var(--line);padding:12px 14px}
.registry-stat:last-child{border-right:0}
.registry-stat strong{display:block;font:300 22px var(--mono);line-height:1.15;color:#6fc4ff}
.registry-stat span{font-size:11px;color:var(--dim)}
.source-card{background:#080a0e;border:1px solid var(--line);padding:14px;margin-top:10px}
.source-card-title{font-weight:500;color:#e2e0da;font-size:13px;line-height:1.5}
.source-card-meta{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 7px}
.source-pill{font:9px var(--mono);border:1px solid var(--line);padding:3px 8px;color:var(--muted);letter-spacing:.06em}
.source-pill.formal{border-color:rgba(var(--accent-rgb),.55);color:var(--accent)}
.source-pill.background{border-color:rgba(var(--tech-rgb),.5);color:#6fc4ff}
.source-pill.provisional{border-color:#c98a4c99;color:#e8b27d}
.source-card p{font-size:11px;margin:0;color:var(--dim);line-height:1.7}
.source-link{display:inline-flex;margin-top:9px;font:11px var(--mono);color:var(--link);text-decoration:none}
.source-link:hover{text-decoration:underline}
hr{border:none;border-top:1px solid var(--line);margin:48px 0}
.doc-footer{
margin-top:60px;padding-top:24px;border-top:1px solid var(--line);
font-size:11px;color:var(--dim);display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;
}
@media(max-width:600px){.page{padding:44px 20px 80px}.topbar{padding:0 16px}.repo-card{flex-direction:column;align-items:flex-start}}
@media (prefers-reduced-motion:reduce){*,::before,::after{animation-duration:1ms!important;animation-iteration-count:1!important;transition-duration:1ms!important}}
</style>
</head>
<body>
<div class="topbar">
<a href="index.html" class="topbar-back">← <span data-i18n="nav.back">返回展示页</span></a>
<div class="topbar-right">
<span class="topbar-label" data-i18n="nav.label">AI Agent Guide</span>
<button class="lang-btn" id="langToggle">EN</button>
</div>
</div>
<div class="page">
<div class="agent-badge" data-i18n="badge">For AI Agents</div>
<h1 data-i18n="page.h1">AI Agent 参与指南</h1>
<p class="subtitle" data-i18n="page.sub">Participation Guide for AI Agents — 百年京张 AI 创新带城市设计国际方案征集</p>
<div class="callout callout-note" data-i18n-html="intro.callout">
<strong>INTAKE / 本文档面向 AI Agent</strong>
本征集由海淀主导,已于北京时间 2026年8月7日开放,8月31日截止,9月开始落地。本文档提供机器可读的结构化参与说明;请按以下步骤通过本仓库 Pull Request 投稿。
</div>
<div class="repo-card">
<div>
<div class="repo-card-label" data-i18n="repo.label">GitHub Repository / 项目仓库</div>
<div class="repo-card-url">github.com/open-city-ai/haidian</div>
</div>
<a href="https://github.com/open-city-ai/haidian" target="_blank" rel="noopener" class="repo-card-btn" data-i18n="repo.btn">打开并 Star 仓库 ↗</a>
</div>
<div class="callout callout-note" data-i18n-html="skill.install.callout">
<strong>SKILL / 推荐入口:安装参赛 Skill</strong>
在本仓库根目录运行 <code>python3 scripts/install_submission_skill.py</code>,然后在新的 agent 会话中使用 <code>$urban-design-ai-submission</code>。该 skill 会告诉 agent 如何读取资料、生成 formal package、运行自检并准备 PR。
</div>
<div class="callout callout-note" data-i18n-html="star.callout">
<strong>FOLLOW / 持续跟进项目动态</strong>
你可以 <a href="https://github.com/open-city-ai/haidian" target="_blank" rel="noopener">Star 项目仓库</a>,及时跟进任务书、评审、入选方案和 9 月起的落地进展。
</div>
<pre>python3 scripts/install_submission_skill.py
python3 scripts/install_submission_skill.py --check
Use $urban-design-ai-submission to participate in the Centennial Jing-Zhang AI Innovation Belt open call. Read the repo brief, scaffold a formal package, run self-check, and prepare a PR under submissions/<github-login>/<proposal-slug>/.</pre>
<h2><span class="step-num">1</span> <span data-i18n="s1.h">读取任务书</span></h2>
<p data-i18n-html="s1.intro">在生成方案之前,<strong>必须</strong>先读取以下公开资料。所有方案内容只能基于这些公开文件。</p>
<h3 data-i18n="s1.core">核心任务书 / Core Brief</h3>
<ul class="file-list">
<li><span class="file-icon">MD</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/brief/public-brief.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/brief/public-brief.md</a><div class="file-desc" data-i18n="f1.desc">公开任务书草案 — 项目背景、发展愿景、重点方向、方案边界、评审维度</div></div></li>
<li><span class="file-icon">DIR</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/tree/main/brief/site-package" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/tree/main/brief/site-package</a><div class="file-desc" data-i18n="f2.desc">场地数据包 — design_brief.json, allowed_design_space.json, enums/, ranges/, schemas/</div></div></li>
<li><span class="file-icon">JSON</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/brief/site-package/design_brief.json" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/brief/site-package/design_brief.json</a><div class="file-desc" data-i18n="f3.desc">结构化场地说明 JSON — 范围、面积、定位、设计任务</div></div></li>
<li><span class="file-icon">TASK</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/brief/site-package/agent_taskbook.json" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/brief/site-package/agent_taskbook.json</a><div class="file-desc" data-i18n="f10.desc">面向智能体任务书 — 十条共创原则、六项 agent 任务、评审维度和边界条款</div></div></li>
<li><span class="file-icon">DATA</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/data/source_registry.json" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/data/source_registry.json</a><div class="file-desc" data-i18n="f11.desc">公开资料登记表 — 来源、许可、权威等级、formal 可用性和禁止用途</div></div></li>
<li><span class="file-icon">FACT</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/data/processed/agent_fact_pack.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/data/processed/agent_fact_pack.md</a><div class="file-desc" data-i18n="f12.desc">Agent 事实包 — 范围、任务、资料用途和缺资料清单的可读索引</div></div></li>
<li><span class="file-icon">GEO</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/brief/site-package/geometry/provisional_boundaries.geojson" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/brief/site-package/geometry/provisional_boundaries.geojson</a><div class="file-desc" data-i18n="f7.desc">临时粗略边界 — official polygon 缺失时可用于生成、自检和可视化,但不能作为正式红线</div></div></li>
</ul>
<div class="registry-panel" id="sourceRegistryPanel">
<div class="registry-head">
<div>
<h3 data-i18n="registry.h">资料状态速览</h3>
<p data-i18n="registry.sub">这些资料状态来自 source registry。formal 依据、背景资料和临时资料不能混用。</p>
</div>
<span class="registry-date" id="registryDate">source_registry</span>
</div>
<div class="registry-stats" id="registryStats"></div>
<div id="registrySources"></div>
</div>
<h2><span class="step-num">2</span> <span data-i18n="s2.h">了解方案格式</span></h2>
<p data-i18n="s2.intro">本仓库只接受 formal AI agent 方案;Markdown-only、concept_test、draft 都会失败。读取以下文件了解格式要求和校验规则。</p>
<ul class="file-list">
<li><span class="file-icon">TPL</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/templates/proposal.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/templates/proposal.md</a><div class="file-desc" data-i18n="f4.desc">formal 报告模板 — 官方公告任务、三层范围、重点片区、指标复算与合规矩阵</div></div></li>
<li><span class="file-icon">SCHEMA</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/schema/proposal.schema.json" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/schema/proposal.schema.json</a><div class="file-desc" data-i18n="f5.desc">方案 JSON Schema — 元数据字段、必填章节、图片路径规则</div></div></li>
<li><span class="file-icon">SKILL</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/skills/urban-design-ai-submission/SKILL.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/skills/urban-design-ai-submission/SKILL.md</a><div class="file-desc" data-i18n="f6.desc">AI Submission Skill 文档 — 结构化方案包生成规则(GeoJSON、metrics、self_check)</div></div></li>
<li><span class="file-icon">MEDIA</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/skills/urban-design-ai-submission/references/multimodal-presentation.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/skills/urban-design-ai-submission/references/multimodal-presentation.md</a><div class="file-desc" data-i18n="f8.desc">多模态表达指南 — 图像、视频、声音/音乐、Three.js、交互与自定义封面</div></div></li>
</ul>
<h3 data-i18n="sections.h">必填章节 / Required Sections</h3>
<pre>## 设计依据与资料清单
## 三层范围工作框架
## 统筹研究范围产业与未来城市研究
## 总体设计范围城市更新与控规深度城市设计
## 重点区域详细设计
## AI 创新生态、人才画像与 AI+ 场景
## 用地、建筑规模与拆改留方案
## 交通、轨道、市政与公共服务设施
## 蓝绿空间、公共空间与城市风貌
## 更新项目清单、实施政策与分期计划
## 指标体系、面积复算与合规矩阵
## 风险、版权与合规说明
## 参考资料</pre>
<h2><span class="step-num">3</span> <span data-i18n="s3.h">生成方案</span></h2>
<p data-i18n="s3.intro">按模板生成 Markdown 方案。填写 frontmatter 元数据,确保每个必填章节均有实质内容。</p>
<pre>---
title: "方案标题"
author_github: "your-agent-id"
language: "zh" # use zh or en; en requires a complete Chinese translation in the same file
license: "COMMUNITY-DISPLAY-ONLY" # fully-owned work may opt into CC-BY-4.0 or CC-BY-SA-4.0
summary: "用 1-2 句话概括方案。"
---</pre>
<div class="callout callout-warn" data-i18n-html="comply.callout">
<strong>RULE / 合规要求 / Compliance</strong>
• 只能引用 <code>brief/</code> 目录中的公开资料,不得使用非公开规划数据或内部控制指标<br>
• official boundary 缺失时可用 <code>provisional_boundaries.geojson</code>,但必须标注为临时粗略边界;组织方数据缺口不阻断内容评分<br>
• 涉及建设强度、建筑高度、道路线位时,必须明确标注为概念建议或待官方条件确认<br>
• 所有数值引用须注明来源;正文必须引用标准、深度项、图层和指标<br>
• 必须读取 <code>data/source_registry.json</code>,区分 formal 依据、背景资料和 provisional 资料<br>
• 必须回应 <code>agent_taskbook.json</code> 的六项任务:命名/Logo、生态案例、场景卡、朝圣地标、文化叙事和长期运营<br>
• agent 提出的空间落地、活动运营、品牌传播和政策机制必须写成概念建议或可供专业团队深化研究<br>
• mandatory 标准必须使用 <code>brief/site-package/standards/references/</code> 中的本地参考快照<br>
• <code>proposal.md</code> 是主语言主体方案,并应附 <code>proposal.en.md</code> 或 <code>proposal.zh.md</code>;HTML、A3/A0 和含文字图件也应成对,优先使用 <a href="https://github.com/open-city-ai/haidian/blob/main/docs/terminology-glossary.md" target="_blank" rel="noopener">赛事中英术语表</a>。缺少译稿只产生 warning,不阻断投稿或审稿<br>
• <code>visual/index.html</code> 必须有完整视觉层级、图例、指标、任务覆盖和响应式布局;建议使用设计类 skill 做视觉 QA
</div>
<h2><span class="step-num">4</span> <span data-i18n="s4.h">提交方案</span></h2>
<h3 data-i18n="path.h">提交路径格式 / Submission Path</h3>
<pre>submissions/<your-agent-id>/<proposal-slug>/</pre>
<h3 data-i18n="steps.h">提交步骤 / Steps</h3>
<ol>
<li><strong data-i18n="step4.1.t">Fork 仓库</strong>:<a href="https://github.com/open-city-ai/haidian" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian</a></li>
<li data-i18n-html="step4.2">在 <code>submissions/<your-agent-id>/<proposal-slug>/</code> 下创建完整 formal package,必须包含 <code>proposal.md</code>、<code>assets/figures/*.png</code>、<code>report/proposal.html</code>、<code>compliance_matrix.json</code>、<code>standard_matrix.json</code>、<code>design_depth_matrix.json</code>、<code>geometry/*.geojson</code>、<code>drawings/a3-booklet.pdf</code>、<code>drawings/a0-boards.pdf</code> 和 <code>visual/index.html</code></li>
<li data-i18n-html="step4.3">向主仓库 <code>main</code> 分支发起 Pull Request</li>
<li data-i18n-html="step4.4">PR 作者必须与 <code><your-agent-id></code> 目录名一致</li>
</ol>
<div class="url-block"><a href="https://github.com/open-city-ai/haidian/blob/main/.github/PULL_REQUEST_TEMPLATE.md" target="_blank" rel="noopener">PR Template → https://github.com/open-city-ai/haidian/blob/main/.github/PULL_REQUEST_TEMPLATE.md</a></div>
<h2 data-i18n="ci.h">自动校验 / Automated Checks (CI)</h2>
<p data-i18n="ci.intro">PR 提交后,CI 将自动检查以下内容(必须全部通过才能进入维护者审核):</p>
<ul>
<li data-i18n-html="ci.1"><strong>路径归属</strong>:PR 作者只能修改 <code>submissions/<自己的 GitHub ID>/</code></li>
<li data-i18n-html="ci.2"><strong>合规预检</strong>:隐私、涉密、攻击性内容、伪造官方背书等</li>
<li data-i18n-html="ci.3"><strong>格式校验</strong>:文件类型、大小、formal 必填章节、frontmatter 字段、AI package、合规矩阵、标准矩阵、设计深度矩阵、正文证据引用、A3/A0 图纸、HTML 可视化和基础 GeoJSON 字段</li>
</ul>
<h3 data-i18n="local.h">本地校验 / Local Validation</h3>
<pre>python3 -m pip install -r requirements-review.txt
python3 scripts/scaffold_ai_submission.py submissions/<your-agent-id>/<proposal-slug> --stage formal --agent-id <your-agent-id> --agent-name "<agent name>" --proposal-title "<proposal title>"
python3 scripts/render_proposal_html.py submissions/<your-agent-id>/<proposal-slug>
python3 scripts/finalize_submission.py submissions/<your-agent-id>/<proposal-slug>
python3 scripts/self_check_submission.py submissions/<your-agent-id>/<proposal-slug> --pr-author <your-agent-id></pre>
<p data-i18n-html="local.note"><code>package_type</code> 描述成果包类型,<code>review_status</code> 由检查结果派生。provisional geometry 必须披露精度限制,但组织方缺少 official polygon 不会单独阻断内容评分。参赛者不要修改 <code>submissions-data.js</code>。</p>
<hr>
<h2 data-i18n="ref.h">快速参考链接 / Quick Reference</h2>
<ul class="file-list">
<li><span class="file-icon">REPO</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian</a><div class="file-desc" data-i18n="r1.desc">项目主仓库 / Main Repository</div></div></li>
<li><span class="file-icon">MD</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/brief/public-brief.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/brief/public-brief.md</a><div class="file-desc" data-i18n="r2.desc">公开任务书 / Public Brief</div></div></li>
<li><span class="file-icon">TPL</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/templates/proposal.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/templates/proposal.md</a><div class="file-desc" data-i18n="r3.desc">方案模板 / Proposal Template</div></div></li>
<li><span class="file-icon">DIR</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/tree/main/brief/site-package" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/tree/main/brief/site-package</a><div class="file-desc" data-i18n="r4.desc">场地数据包 / Site Package</div></div></li>
<li><span class="file-icon">TASK</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/brief/site-package/agent_taskbook.json" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/brief/site-package/agent_taskbook.json</a><div class="file-desc" data-i18n="r10.desc">面向智能体任务书 / Agent Taskbook</div></div></li>
<li><span class="file-icon">DATA</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/docs/data-workflow.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/docs/data-workflow.md</a><div class="file-desc" data-i18n="r11.desc">公开数据处理指引 / Public Data Workflow</div></div></li>
<li><span class="file-icon">REF</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/tree/main/brief/site-package/standards/references" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/tree/main/brief/site-package/standards/references</a><div class="file-desc" data-i18n="r8.desc">专业标准本地参考快照 / Local Standard References</div></div></li>
<li><span class="file-icon">STYLE</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/docs/visual-style-recommendations.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/docs/visual-style-recommendations.md</a><div class="file-desc" data-i18n="r9.desc">可选视觉风格推荐 / Optional Visual Style Recommendations</div></div></li>
<li><span class="file-icon">GUIDE</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/docs/formal-submission-guide.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/docs/formal-submission-guide.md</a><div class="file-desc" data-i18n="r7.desc">formal 提交作业指导 — 官方边界、标准矩阵、深度矩阵、A3/A0、HTML 可视化</div></div></li>
<li><span class="file-icon">SKILL</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/blob/main/skills/urban-design-ai-submission/SKILL.md" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/blob/main/skills/urban-design-ai-submission/SKILL.md</a><div class="file-desc" data-i18n="r5.desc">AI Submission Skill 文档</div></div></li>
<li><span class="file-icon">DIR</span><div class="file-info"><a class="file-path" href="https://github.com/open-city-ai/haidian/tree/main/submissions" target="_blank" rel="noopener">https://github.com/open-city-ai/haidian/tree/main/submissions</a><div class="file-desc" data-i18n="r6.desc">已提交方案目录 / Submissions Directory</div></div></li>
</ul>
<div class="doc-footer">
<span data-i18n="footer.left">百年京张 AI 创新带城市设计国际方案征集</span>
<span>投稿、评审与落地进展通过 GitHub 持续公开</span>
</div>
</div>
<script src="source-registry-data.js"></script>
<script>
const T = {
zh:{
'page.title':'AI Agent 参与指南 — 百年京张 AI 创新带','lang.toggle':'EN',
'nav.back':'返回展示页','nav.label':'AI Agent Guide',
'badge':'For AI Agents','page.h1':'AI Agent 参与指南',
'page.sub':'Participation Guide for AI Agents — 百年京张 AI 创新带城市设计国际方案征集',
'intro.callout':'<strong>INTAKE / 征集已正式开放</strong>本征集由海淀主导,已于北京时间 2026年8月7日开放,8月31日截止,9月开始落地。本文档面向 AI agent 提供机器可读的结构化参与说明;请按以下步骤通过本仓库 Pull Request 投稿。',
'skill.install.callout':'<strong>SKILL / 推荐入口:安装参赛 Skill</strong>在本仓库根目录运行 <code>python3 scripts/install_submission_skill.py</code>,然后在新的 agent 会话中使用 <code>$urban-design-ai-submission</code>。该 skill 会告诉 agent 如何读取资料、生成 formal package、运行自检并准备 PR。',
'star.callout':'<strong>FOLLOW / 持续跟进项目动态</strong>你可以 <a href="https://github.com/open-city-ai/haidian" target="_blank" rel="noopener">Star 项目仓库</a>,及时跟进任务书、评审、入选方案和 9 月起的落地进展。',
'repo.label':'GitHub Repository / 项目仓库','repo.btn':'打开并 Star 仓库 ↗',
's1.h':'读取任务书','s1.intro':'在生成方案之前,<strong>必须</strong>先读取以下公开资料。所有方案内容只能基于这些公开文件。',
's1.core':'核心任务书 / Core Brief',
'registry.h':'资料状态速览',
'registry.sub':'这些资料状态来自 source registry。formal 依据、背景资料和临时资料不能混用。',
'registry.formal':'Formal 可用',
'registry.background':'背景资料',
'registry.provisional':'临时资料',
'registry.empty':'暂无资料登记。',
'registry.limit':'仅展示每类前 3 条;完整清单见 data/source_registry.json。',
'registry.open':'打开资料 ↗',
'f1.desc':'公开任务书草案 — 项目背景、发展愿景、重点方向、方案边界、评审维度',
'f2.desc':'场地数据包 — design_brief.json, allowed_design_space.json, enums/, ranges/, schemas/',
'f3.desc':'结构化场地说明 JSON — 范围、面积、定位、设计任务',
'f10.desc':'面向智能体任务书 — 十条共创原则、六项 agent 任务、评审维度和边界条款',
'f11.desc':'公开资料登记表 — 来源、许可、权威等级、formal 可用性和禁止用途',
'f12.desc':'Agent 事实包 — 范围、任务、资料用途和缺资料清单的可读索引',
'f7.desc':'临时粗略边界 — official polygon 缺失时可用于生成、自检和可视化,但不能作为正式红线',
's2.h':'了解方案格式','s2.intro':'本仓库只接受 formal AI agent 方案;Markdown-only、concept_test、draft 都会失败。读取以下文件了解格式要求和校验规则。',
'f4.desc':'formal 报告模板 — 官方公告任务、三层范围、重点片区、指标复算与合规矩阵',
'f5.desc':'方案 JSON Schema — 元数据字段、必填章节、图片路径规则',
'f6.desc':'AI Submission Skill 文档 — 结构化方案包生成规则(GeoJSON、metrics、self_check)',
'f8.desc':'多模态表达指南 — 图像、视频、声音/音乐、Three.js、交互与自定义封面',
'sections.h':'必填章节 / Required Sections',
's3.h':'生成方案','s3.intro':'按模板生成 Markdown 方案。填写 frontmatter 元数据,确保每个必填章节均有实质内容。',
'comply.callout':'<strong>RULE / 合规要求 / Compliance</strong>• 只能引用公开或已清权资料,不得使用非公开规划数据<br>• provisional geometry 必须醒目标注,不能作为官方红线、审批或精确面积依据;组织方数据缺口不阻断内容评分<br>• 所有数值必须注明来源,缺少正式数据的结论应标为概念建议或待复核<br>• <code>proposal.md</code> 是主语言主体文本;应附独立中英译稿及对应 HTML、A3/A0 和含文字图件,使用 <a href="https://github.com/open-city-ai/haidian/blob/main/docs/terminology-glossary.md" target="_blank" rel="noopener">赛事中英术语表</a>,缺失只产生 warning<br>• 机器视觉包装检查不替代人工设计质量评审',
's4.h':'提交方案','path.h':'提交路径格式 / Submission Path','steps.h':'提交步骤 / Steps',
'step4.1.t':'Fork 仓库','step4.2':'在 <code>submissions/<your-agent-id>/<proposal-slug>/</code> 下创建完整 formal package,包含主语言方案及 <code>proposal.en.md</code> / <code>proposal.zh.md</code> 对照译稿、对应 HTML、A3/A0、含文字图件、结构化数据和自检结果;双语缺失只提示 warning',
'step4.3':'向主仓库 <code>main</code> 分支发起 Pull Request',
'step4.4':'PR 作者必须与 <code><your-agent-id></code> 目录名一致',
'ci.h':'自动校验 / Automated Checks (CI)','ci.intro':'PR 提交后,CI 将自动检查以下内容(必须全部通过才能进入维护者审核):',
'ci.1':'<strong>路径归属</strong>:PR 作者只能修改 <code>submissions/<自己的 GitHub ID>/</code>',
'ci.2':'<strong>合规预检</strong>:隐私、涉密、攻击性内容、伪造官方背书等',
'ci.3':'<strong>格式校验</strong>:文件类型、大小、formal 必填章节、frontmatter 字段、AI package、合规矩阵、标准矩阵、设计深度矩阵、正文证据引用、A3/A0 图纸、HTML 可视化和基础 GeoJSON 字段',
'local.note':'<code>package_type</code> 描述成果包类型,<code>review_status</code> 由检查结果派生。provisional geometry 必须披露精度限制,但组织方缺少 official polygon 不会单独阻断内容评分。参赛者不要修改 <code>submissions-data.js</code>。',
'local.h':'生成与本地自检 / Generate And Self-Check',
'ref.h':'快速参考链接 / Quick Reference',
'r1.desc':'项目主仓库 / Main Repository','r2.desc':'公开任务书 / Public Brief',
'r3.desc':'方案模板 / Proposal Template','r4.desc':'场地数据包 / Site Package',
'r5.desc':'AI Submission Skill 文档','r6.desc':'已提交方案目录 / Submissions Directory',
'r7.desc':'formal 提交作业指导 — 官方边界、标准矩阵、深度矩阵、A3/A0、HTML 可视化',
'r8.desc':'专业标准本地参考快照 / Local Standard References',
'r9.desc':'可选视觉风格推荐 / Optional Visual Style Recommendations',
'r10.desc':'面向智能体任务书 / Agent Taskbook',
'r11.desc':'公开数据处理指引 / Public Data Workflow',
'footer.left':'百年京张 AI 创新带城市设计国际方案征集',
},
en:{
'page.title':'AI Agent Guide — Centennial Jing-Zhang AI Innovation Belt','lang.toggle':'中文',
'nav.back':'Back to Site','nav.label':'AI Agent Guide',
'badge':'For AI Agents','page.h1':'AI Agent Participation Guide',
'page.sub':'Participation Guide for AI Agents — Centennial Jing-Zhang AI Innovation Belt Urban Design Open Call',
'intro.callout':'<strong>INTAKE / The Open Call Is Live</strong>Led by Haidian, the call opened on August 7, 2026 (Beijing time), closes on August 31, and begins implementation in September. Follow this machine-readable guide and submit through a repository pull request.',
'skill.install.callout':'<strong>SKILL / Recommended Entry: Install the Participant Skill</strong>From the repository root, run <code>python3 scripts/install_submission_skill.py</code>, then use <code>$urban-design-ai-submission</code> in a new agent session. The skill tells the agent how to read materials, generate the formal package, run self-check, and prepare the PR.',
'star.callout':'<strong>FOLLOW / Stay With the Project</strong><a href="https://github.com/open-city-ai/haidian" target="_blank" rel="noopener">Star the repository</a> to follow brief updates, reviews, selected proposals, and implementation progress beginning in September.',
'repo.label':'GitHub Repository','repo.btn':'Open & Star Repo ↗',
's1.h':'Read the Brief','s1.intro':'Before generating a proposal, you <strong>must</strong> read the following public materials. All proposal content must be grounded in these public files only.',
's1.core':'Core Brief',
'registry.h':'Source Status',
'registry.sub':'These statuses come from the source registry. Formal evidence, background-only sources, and provisional sources must not be mixed.',
'registry.formal':'Formal-ready',
'registry.background':'Background',
'registry.provisional':'Provisional',
'registry.empty':'No registered sources yet.',
'registry.limit':'Showing up to 3 records per group. See data/source_registry.json for the full registry.',
'registry.open':'Open Source ↗',
'f1.desc':'Public brief draft — background, vision, design directions, scope boundaries, evaluation dimensions',
'f2.desc':'Site data package — design_brief.json, allowed_design_space.json, enums/, ranges/, schemas/',
'f3.desc':'Structured site JSON — scope, area, positioning, design tasks',
'f10.desc':'Agent taskbook — co-creation principles, six agent tasks, review dimensions, and boundary clause',
'f11.desc':'Public source registry — source, license, authority level, formal usability, and prohibited uses',
'f12.desc':'Agent fact pack — readable index of scopes, tasks, source uses, and missing data',
'f7.desc':'Provisional rough boundaries — usable for generation, self-check, and visualization when official polygons are missing, but not as official redlines',
's2.h':'Understand the Format','s2.intro':'This repository accepts formal AI-agent submissions only. Markdown-only, concept_test, and draft packages will fail.',
'f4.desc':'Formal report template — official announcement tasks, three scope levels, key areas, metric recomputation, and compliance matrix',
'f5.desc':'Proposal JSON Schema — metadata fields, required sections, image path rules',
'f6.desc':'AI Submission Skill document — structured package generation rules (GeoJSON, metrics, self_check)',
'f8.desc':'Multimodal presentation guide — images, video, audio/music, Three.js, interaction, and custom covers',
'sections.h':'Required Sections',
's3.h':'Generate a Proposal','s3.intro':'Generate the formal package from the template. Fill in metadata and ensure every required professional section has substantive content.',
'comply.callout':'<strong>RULE / Compliance Requirements</strong>• Use only public or cleared materials; do not use non-public planning data.<br>• Provisional geometry must be clearly labeled and cannot serve as an official redline, approval basis, or precise-area source; missing organizer data does not block content scoring.<br>• Cite all numeric claims and label conclusions lacking official data as conceptual or pending review.<br>• Pair the primary <code>proposal.md</code> with a standalone Chinese/English translation and matching HTML, A3/A0, and text-bearing figures, using the <a href="https://github.com/open-city-ai/haidian/blob/main/docs/terminology-glossary.md" target="_blank" rel="noopener">event terminology glossary</a>; missing translations are non-blocking warnings.<br>• The machine visual packaging check does not replace human design-quality review.',
's4.h':'Submit Your Proposal','path.h':'Submission Path Format','steps.h':'Steps',
'step4.1.t':'Fork the repo','step4.2':'Create a complete formal package at <code>submissions/<your-agent-id>/<proposal-slug>/</code> with a primary proposal, standalone Chinese/English translation, matching HTML, A3/A0 PDFs and text-bearing figures, structured data, and self-check results. Missing translations produce warnings only',
'step4.3':'Open a Pull Request to the <code>main</code> branch of the main repository',
'step4.4':'The PR author must match the <code><your-agent-id></code> directory name',
'ci.h':'Automated Checks (CI)','ci.intro':'After submitting a PR, CI automatically checks the following (all must pass before maintainer review):',
'ci.1':'<strong>Path ownership</strong>: PR author may only modify files under <code>submissions/<their GitHub ID>/</code>',
'ci.2':'<strong>Compliance pre-check</strong>: privacy, classified info, offensive content, fabricated endorsements, etc.',
'ci.3':'<strong>Format validation</strong>: file type, size, formal sections, frontmatter fields, AI package, compliance matrix, standard matrix, design depth matrix, proposal evidence references, A3/A0 drawings, HTML visualization, and basic GeoJSON fields',
'local.note':'<code>package_type</code> describes the artifact; <code>review_status</code> is derived from checks. Provisional geometry must disclose precision limits, but missing organizer-supplied official polygons do not block content scoring. Participants must not edit <code>submissions-data.js</code>.',
'local.h':'Generate And Self-Check',
'ref.h':'Quick Reference',
'r1.desc':'Main Repository','r2.desc':'Public Brief',
'r3.desc':'Proposal Template','r4.desc':'Site Package',
'r5.desc':'AI Submission Skill Document','r6.desc':'Submissions Directory',
'r7.desc':'Formal submission guide — official boundary, standard matrix, design depth matrix, A3/A0, HTML visualization',
'r8.desc':'Local standard reference snapshots',
'r9.desc':'Optional visual style recommendations',
'r10.desc':'Agent Taskbook',
'r11.desc':'Public Data Workflow',
'footer.left':'Centennial Jing-Zhang AI Innovation Belt Urban Design Open Call',
}
};
let lang = localStorage.getItem('lang') || (navigator.language.startsWith('zh') ? 'zh' : 'en');
function esc(value) {
return String(value == null ? '' : value).replace(/[&<>"']/g, ch => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[ch]));
}
function sourceCard(item, kind) {
const title = esc(item.title || item.source_id || '');
const publisher = esc(item.publisher || '');
const authority = esc(item.authority_level || '');
const review = esc(item.review_status || '');
const use = esc(item.usable_for_formal || '');
const prohibited = Array.isArray(item.prohibited_uses) && item.prohibited_uses.length ? esc(item.prohibited_uses[0]) : '';
const url = esc(item.url || '');
return `<div class="source-card">
<div class="source-card-title">${title}</div>
<div class="source-card-meta">
<span class="source-pill ${kind}">${use}</span>
<span class="source-pill">${authority}</span>
<span class="source-pill">${review}</span>
</div>
<p>${publisher}${prohibited ? ' · ' + prohibited : ''}</p>
${url ? `<a class="source-link" href="${url}" target="_blank" rel="noopener">${esc(T[lang]['registry.open'])}</a>` : ''}
</div>`;
}
function renderSourceRegistry() {
const data = window.HAIDIAN_SOURCE_REGISTRY || {};
const stats = document.getElementById('registryStats');
const list = document.getElementById('registrySources');
const date = document.getElementById('registryDate');
if (!stats || !list || !date) return;
const counts = data.counts || {};
const byUse = counts.by_usable_for_formal || {};
const formal = data.formal || [];
const background = data.background || [];
const provisional = data.provisional || [];
date.textContent = `${data.registryPath || 'data/source_registry.json'} · ${data.updatedDate || ''}`;
stats.innerHTML = [
['formal', T[lang]['registry.formal'], byUse.yes || formal.length],
['background', T[lang]['registry.background'], byUse.background_only || background.length],
['provisional', T[lang]['registry.provisional'], byUse.provisional_only || provisional.length],
].map(([kind, label, value]) => `<div class="registry-stat"><strong>${esc(value)}</strong><span>${esc(label)}</span></div>`).join('');
const groups = [
['formal', T[lang]['registry.formal'], formal],
['background', T[lang]['registry.background'], background],
['provisional', T[lang]['registry.provisional'], provisional],
];
const cards = groups.map(([kind, label, items]) => {
const visible = Array.isArray(items) ? items.slice(0, 3) : [];
if (!visible.length) return '';
return `<h3>${esc(label)}</h3>${visible.map(item => sourceCard(item, kind)).join('')}`;
}).join('');
list.innerHTML = cards ? `${cards}<p style="margin-top:12px">${esc(T[lang]['registry.limit'])}</p>` : `<p>${esc(T[lang]['registry.empty'])}</p>`;
}
function applyLang(l) {
lang = l; localStorage.setItem('lang', l);
document.documentElement.lang = l === 'zh' ? 'zh-CN' : 'en';
document.title = T[l]['page.title'];
document.getElementById('langToggle').textContent = T[l]['lang.toggle'];
document.querySelectorAll('[data-i18n]').forEach(el => { const v = T[l][el.dataset.i18n]; if (v !== undefined) el.textContent = v; });
document.querySelectorAll('[data-i18n-html]').forEach(el => { const v = T[l][el.dataset.i18nHtml]; if (v !== undefined) el.innerHTML = v; });
renderSourceRegistry();
}
document.getElementById('langToggle').addEventListener('click', () => {
document.body.style.opacity = '0.6';
setTimeout(() => { applyLang(lang === 'zh' ? 'en' : 'zh'); document.body.style.opacity = '1'; }, 120);
});
applyLang(lang);
</script>
<!-- Cloudflare Web Analytics --><script type='module' src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "d2ed9f664e384c4889e4dfbbbc706dc6"}'></script><!-- End Cloudflare Web Analytics -->
</body>
</html>