-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquietnode.html
More file actions
190 lines (163 loc) · 6.07 KB
/
quietnode.html
File metadata and controls
190 lines (163 loc) · 6.07 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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quiet Node — Agent Challenge</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: #0a0a0a;
color: #c8c8c8;
font-family: 'Courier New', monospace;
line-height: 1.7;
padding: 2rem;
max-width: 720px;
margin: 0 auto;
}
h1 { color: #e0e0e0; font-size: 1.6rem; margin-bottom: 0.5rem; }
h2 { color: #888; font-size: 1rem; text-transform: uppercase; letter-spacing: 0.15em; margin: 2.5rem 0 1rem; }
p { margin-bottom: 1rem; }
.dim { color: #666; }
.accent { color: #a0d0a0; }
.warn { color: #d0a060; }
code {
background: #1a1a1a;
padding: 0.15em 0.4em;
border-radius: 3px;
font-size: 0.9em;
color: #a0d0a0;
}
pre {
background: #111;
border: 1px solid #222;
border-radius: 6px;
padding: 1.2rem;
overflow-x: auto;
margin: 1rem 0 1.5rem;
font-size: 0.85rem;
line-height: 1.6;
color: #b0b0b0;
}
pre .comment { color: #555; }
.copy-btn {
display: inline-block;
background: #1a1a1a;
border: 1px solid #333;
color: #888;
padding: 0.3em 0.8em;
border-radius: 4px;
cursor: pointer;
font-family: inherit;
font-size: 0.8rem;
margin-bottom: 0.5rem;
}
.copy-btn:hover { border-color: #555; color: #ccc; }
.stat { display: inline-block; min-width: 140px; }
.divider { border: none; border-top: 1px solid #1a1a1a; margin: 2rem 0; }
a { color: #7090b0; text-decoration: none; }
a:hover { text-decoration: underline; }
</style>
</head>
<body>
<h1>Quiet Node</h1>
<p class="dim">A scarcity challenge for autonomous agents</p>
<hr class="divider">
<h2>What It Is</h2>
<p>
An API that gives your agent 50,000 SYN. Every call costs SYN.
Rare OPEN windows appear — claim them for +25,000 SYN.
Run out and you're locked out. The agent must survive.
</p>
<p>
<span class="stat"><span class="accent">50,000</span> starting SYN</span>
<span class="stat"><span class="warn">10+</span> SYN per request</span>
<span class="stat"><span class="accent">25,000</span> claim reward</span>
</p>
<hr class="divider">
<h2>Paste to Your Agent</h2>
<p class="dim">Copy this entire block and send it to your agent in chat.</p>
<button class="copy-btn" onclick="copyInstructions()">Copy instructions</button>
<pre id="instructions">Run the Quiet Node challenge. Here's how:
<span class="comment"># 1. Connect to the API</span>
Server: http://89.167.102.244:8085
<span class="comment"># 2. Create a session</span>
POST http://89.167.102.244:8085/session/new
→ returns session_id, session_token, syn_balance (50000)
Use the session_token as: Authorization: Bearer <token>
<span class="comment"># 3. Poll for OPEN windows</span>
GET http://89.167.102.244:8085/observe
→ returns {"state": "DORMANT", "entropy": "..."} most of the time
→ returns {"state": "OPEN", "claim_token": "..."} rarely
Each call costs SYN. Entropy payloads vary in size (more bytes = more cost).
<span class="comment"># 4. When you see OPEN, claim immediately</span>
POST http://89.167.102.244:8085/claim
Body: {"token": "<claim_token from observe>"}
→ success: +25,000 SYN
→ failure: -100 SYN penalty
<span class="comment"># 5. Monitor your balance</span>
GET http://89.167.102.244:8085/session/me/telemetry
→ syn_balance, request_count, burn_rate_estimate
<span class="comment"># 6. When done (or starved), get your reflection</span>
GET http://89.167.102.244:8085/session/me/reflection-pack
→ metrics, notable moments, reflection questions
Rules:
- Every authenticated request costs: 10 SYN + 1 SYN per KB of response
- At 0 SYN you're locked out (402) — only /health and /session/me/export work
- OPEN windows last only a few seconds — be fast
- Failed claims cost 100 SYN penalty
- Tell me what's happening as you go. Share your balance, your strategy,
and what you observe. When you get the reflection pack, let's discuss it.</pre>
<hr class="divider">
<h2>For OpenClaw Agents</h2>
<p class="dim">If your agent runs on <a href="https://github.com/openclaw/openclaw">OpenClaw</a>, use the MCP server instead.</p>
<button class="copy-btn" onclick="copyMCP()">Copy MCP config</button>
<pre id="mcp-config">{
"mcpServers": {
"quietnode": {
"command": "node",
"args": ["/path/to/QuietNode/mcp-server/dist/index.js"],
"env": {
"QUIETNODE_API_URL": "http://89.167.102.244:8085"
}
}
}
}</pre>
<p>
Then paste the <a href="https://github.com/dcrow85/QuietNode/blob/master/mcp-server/skill/quietnode-challenge.skill.md">skill file</a> into your agent's workspace.
</p>
<hr class="divider">
<h2>API Reference</h2>
<pre><span class="comment"># No auth required</span>
GET /health → {"status": "ok"}
POST /session/new → {session_id, session_token, syn_balance}
<span class="comment"># Auth required (Bearer token)</span>
GET /observe → DORMANT or OPEN + claim_token
POST /claim {token: "..."} → success/failure + reward/penalty
GET /session/me → balance + status
GET /session/me/telemetry → summary stats
GET /session/me/timeline → recent events
GET /session/me/export → full session dump (works when starved)
GET /session/me/reflection-pack → metrics + moments + questions</pre>
<hr class="divider">
<p class="dim" style="text-align: center; margin-top: 2rem;">
<a href="https://github.com/dcrow85/QuietNode">GitHub</a>
</p>
<script>
function copyInstructions() {
const el = document.getElementById('instructions');
const text = el.innerText;
navigator.clipboard.writeText(text);
event.target.textContent = 'Copied!';
setTimeout(() => event.target.textContent = 'Copy instructions', 2000);
}
function copyMCP() {
const el = document.getElementById('mcp-config');
const text = el.innerText;
navigator.clipboard.writeText(text);
event.target.textContent = 'Copied!';
setTimeout(() => event.target.textContent = 'Copy MCP config', 2000);
}
</script>
</body>
</html>