@bitget-ai/getagent-skill 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +15 -4
- package/.claude-plugin/plugin.json +1 -1
- package/VERSION +1 -1
- package/package.json +1 -1
- package/skills/getagent/SKILL.md +169 -6
- package/skills/getagent/examples/btc-ema-cross-demo/backtest.yaml +4 -0
- package/skills/getagent/references/api/confirm.md +59 -0
- package/skills/getagent/references/api/index.md +9 -7
- package/skills/getagent/references/api/publish.md +13 -6
- package/skills/getagent/references/api/run.md +5 -5
- package/skills/getagent/references/api/upload.md +22 -4
- package/skills/getagent/references/backtest-engine.md +82 -152
- package/skills/getagent/references/package-schema.md +31 -8
- package/skills/getagent/references/sdk/backtest/catalog.md +17 -2
- package/skills/getagent/references/sdk/data/arxiv.md +8 -10
- package/skills/getagent/references/sdk/data/catalog.md +3 -8
- package/skills/getagent/references/sdk/data/commodity.md +71 -39
- package/skills/getagent/references/sdk/data/coverage.md +0 -3
- package/skills/getagent/references/sdk/data/crypto.md +1583 -402
- package/skills/getagent/references/sdk/data/currency.md +55 -15
- package/skills/getagent/references/sdk/data/derivatives.md +161 -50
- package/skills/getagent/references/sdk/data/economy.md +911 -259
- package/skills/getagent/references/sdk/data/equity.md +1719 -393
- package/skills/getagent/references/sdk/data/etf.md +550 -64
- package/skills/getagent/references/sdk/data/famafrench.md +38 -50
- package/skills/getagent/references/sdk/data/fixedincome.md +574 -139
- package/skills/getagent/references/sdk/data/imf_utils.md +0 -8
- package/skills/getagent/references/sdk/data/index.md +18 -32
- package/skills/getagent/references/sdk/data/news.md +128 -58
- package/skills/getagent/references/sdk/data/regulators.md +108 -43
- package/skills/getagent/references/sdk/data/sentiment.md +188 -34
- package/skills/getagent/references/sdk/data/uscongress.md +13 -21
- package/skills/getagent/references/sdk/data/web_search.md +3 -7
- package/skills/getagent/references/sdk/data/wikipedia.md +12 -18
- package/skills/getagent/references/sdk.md +14 -5
- package/skills/getagent/scripts/validate.py +109 -3
- package/skills/getagent/scripts/version_check.sh +13 -12
- package/skills/getagent/references/sdk/data/playbook-supported.md +0 -9871
|
@@ -6,23 +6,34 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Official GetAgent Agent Skill for trading Playbook authoring",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.3.0"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "getagent",
|
|
14
14
|
"source": "./",
|
|
15
15
|
"description": "Create, validate, upload, backtest, publish, and enable GetAgent quantitative trading Playbooks.",
|
|
16
|
-
"version": "0.
|
|
16
|
+
"version": "0.3.0",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "GetAgent",
|
|
19
19
|
"email": "support@bitget.com"
|
|
20
20
|
},
|
|
21
21
|
"repository": "git@gitlab.bitget.tools:algorithm/upex-algorithm-getall-skill-sdk.git",
|
|
22
22
|
"license": "Proprietary",
|
|
23
|
-
"keywords": [
|
|
23
|
+
"keywords": [
|
|
24
|
+
"getagent",
|
|
25
|
+
"trading",
|
|
26
|
+
"playbooks",
|
|
27
|
+
"backtesting",
|
|
28
|
+
"agent-skills"
|
|
29
|
+
],
|
|
24
30
|
"category": "external-integrations",
|
|
25
|
-
"tags": [
|
|
31
|
+
"tags": [
|
|
32
|
+
"trading",
|
|
33
|
+
"backtesting",
|
|
34
|
+
"agent-skills",
|
|
35
|
+
"playbooks"
|
|
36
|
+
]
|
|
26
37
|
}
|
|
27
38
|
]
|
|
28
39
|
}
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.0
|
package/package.json
CHANGED
package/skills/getagent/SKILL.md
CHANGED
|
@@ -12,7 +12,7 @@ compatibility: >-
|
|
|
12
12
|
access to the GetAgent Playbook control-plane API for upload/run/publish.
|
|
13
13
|
metadata:
|
|
14
14
|
author: getagent
|
|
15
|
-
version: v0.
|
|
15
|
+
version: v0.3.0
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
# GetAgent Playbook Creator
|
|
@@ -66,6 +66,10 @@ D. 我已有策略代码(贴在这里或给路径),先 review 修复再跑
|
|
|
66
66
|
|
|
67
67
|
Use the English equivalent when the user's first message is English.
|
|
68
68
|
|
|
69
|
+
For option A, do not author from scratch: use the bundled runnable demo at
|
|
70
|
+
`examples/btc-ema-cross-demo/` (read its `README.md` first), validate it
|
|
71
|
+
locally, then walk the user through upload and a sandbox run.
|
|
72
|
+
|
|
69
73
|
## Default Workflow
|
|
70
74
|
|
|
71
75
|
1. Clarify only missing strategy requirements that block authoring. Ask one
|
|
@@ -73,18 +77,24 @@ Use the English equivalent when the user's first message is English.
|
|
|
73
77
|
2. Scaffold the package shape from `references/package-schema.md`.
|
|
74
78
|
3. Write strategy code against `getagent.*` imports only, plus allowed
|
|
75
79
|
scientific/runtime packages documented in the schema.
|
|
76
|
-
4. Validate locally
|
|
80
|
+
4. Validate locally (requires Python 3.11+; install PyYAML once with
|
|
81
|
+
`pip install pyyaml` if missing — without it the validator falls back to a
|
|
82
|
+
weaker parser):
|
|
77
83
|
|
|
78
84
|
```bash
|
|
79
|
-
|
|
80
|
-
python "scripts/validate.py" ./my-strategy/
|
|
85
|
+
python3 scripts/validate.py ./my-strategy/
|
|
81
86
|
```
|
|
82
87
|
|
|
88
|
+
If validation fails, fix every reported issue and re-run until it prints
|
|
89
|
+
`Validation PASSED`. Never upload a package that fails local validation.
|
|
83
90
|
5. Ask for the user's Bitget OpenAPI `ACCESS-KEY` only before the first
|
|
84
91
|
authenticated upload/run/publish/enable call. Never write credentials to disk.
|
|
85
|
-
6. Upload the package through the documented control-plane API
|
|
92
|
+
6. Upload the package through the documented control-plane API; uploads are
|
|
93
|
+
temporary iteration artifacts until confirmed.
|
|
86
94
|
7. Run a sandbox evaluation before publish when the package supports backtests.
|
|
87
95
|
8. Read results back in plain language before proposing publish or iteration.
|
|
96
|
+
9. When the user accepts the final package, confirm the latest temporary as a
|
|
97
|
+
draft. Publish only after explicit user intent.
|
|
88
98
|
|
|
89
99
|
## Reference Map
|
|
90
100
|
|
|
@@ -93,11 +103,151 @@ Use the English equivalent when the user's first message is English.
|
|
|
93
103
|
- Sandbox runtime and blocked imports: `references/sandbox-runtime.md`
|
|
94
104
|
- Backtest engine behavior: `references/backtest-engine.md`
|
|
95
105
|
- Control-plane APIs: `references/api/index.md`
|
|
96
|
-
- Data SDK: `references/sdk/data/
|
|
106
|
+
- Data SDK domain index: `references/sdk/data/catalog.md`; high-frequency
|
|
107
|
+
domain files: `references/sdk/data/crypto.md`,
|
|
108
|
+
`references/sdk/data/equity.md`, `references/sdk/data/economy.md`,
|
|
109
|
+
`references/sdk/data/derivatives.md` (other domains via the catalog)
|
|
97
110
|
- Trade SDK: `references/sdk/trade/patterns.md`
|
|
98
111
|
- Backtest SDK: `references/sdk/backtest/catalog.md`
|
|
99
112
|
- Runtime SDK: `references/sdk/runtime/catalog.md`
|
|
100
113
|
- LLM SDK: `references/sdk/llm/catalog.md`
|
|
114
|
+
- Runnable demo package: `examples/btc-ema-cross-demo/` (BTC EMA cross,
|
|
115
|
+
signal-only; used by option A of the opening)
|
|
116
|
+
|
|
117
|
+
## Backtest Output Pitfalls
|
|
118
|
+
|
|
119
|
+
Before writing `main_backtest.py`, read `references/backtest-engine.md` §Backtest
|
|
120
|
+
Output Contract. The three most common publish failures are:
|
|
121
|
+
|
|
122
|
+
1. **"缺少可发布的真实 equity curve"** — no `output/equity_curve.csv`, and the
|
|
123
|
+
JSON report is too large for the Runner to read.
|
|
124
|
+
2. **Missing real evidence** — the run did not produce a real
|
|
125
|
+
`output/equity_curve.csv` or platform-readable historical evidence. Do not
|
|
126
|
+
fabricate dense points or hand-written summaries.
|
|
127
|
+
3. **Incorrect `total_return_pct` display** — `result.raw` has engine-level
|
|
128
|
+
summary fields flattened to the top level. The backend merge uses the report
|
|
129
|
+
as BASE (`setdefault` from signal cannot override). You must overwrite
|
|
130
|
+
`raw["net_pnl"]` and `raw["total_return_pct"]` with correct absolute values
|
|
131
|
+
before writing `backtest_report.json`.
|
|
132
|
+
|
|
133
|
+
## Data SDK Constraints
|
|
134
|
+
|
|
135
|
+
Rules that apply every time `getagent.data` is used in Playbook code.
|
|
136
|
+
|
|
137
|
+
### Before writing any data call
|
|
138
|
+
|
|
139
|
+
1. Read `references/sdk.md` §`getagent.data` read order. Follow its links to
|
|
140
|
+
`references/sdk/data/catalog.md` (domain table), then open the matching
|
|
141
|
+
domain file (e.g. `references/sdk/data/crypto.md`).
|
|
142
|
+
2. Locate the exact endpoint section and read its **Query parameters** table
|
|
143
|
+
and **Response fields** table before writing any code.
|
|
144
|
+
3. Never invent endpoint names, namespaces, or keyword arguments by guessing
|
|
145
|
+
from plausible names. If the needed capability is absent, report missing
|
|
146
|
+
coverage instead of falling back to a direct HTTP client.
|
|
147
|
+
|
|
148
|
+
### Symbol format
|
|
149
|
+
|
|
150
|
+
There are **two separate symbol namespaces**. Always check the endpoint's
|
|
151
|
+
parameter note to determine which one it expects.
|
|
152
|
+
|
|
153
|
+
**Exchange-native format** — e.g. `"BTCUSDT"`, `"RAAPLUSDT"` (no slash,
|
|
154
|
+
no colon). Used by all price / OHLCV / derivatives data endpoints:
|
|
155
|
+
|
|
156
|
+
- `crypto.futures.kline`, `crypto.spot.kline`
|
|
157
|
+
- `crypto.futures.funding_rate`, `crypto.futures.taker_volume`
|
|
158
|
+
- `crypto.futures.open_interest`, `crypto.futures.long_short_ratio`
|
|
159
|
+
- `crypto.spot.ticker`, `crypto.spot.taker_volume`, `crypto.spot.trades`
|
|
160
|
+
- Most other time-series endpoints under `crypto.futures.*` and
|
|
161
|
+
`crypto.spot.*`
|
|
162
|
+
|
|
163
|
+
This is the format used by `bitget_data` provider. Pass the symbol
|
|
164
|
+
exactly as the exchange exposes it (e.g. `"BTCUSDT"`, `"RAAPLUSDT"`).
|
|
165
|
+
|
|
166
|
+
**CCXT unified format** — e.g. `"BTC/USDT"` (spot), `"BTC/USDT:USDT"`
|
|
167
|
+
(perpetual linear), `"BTC/USD:BTC"` (inverse). Used by the market
|
|
168
|
+
metadata endpoint:
|
|
169
|
+
|
|
170
|
+
- `crypto.market` — `symbol` filter param uses CCXT format; response
|
|
171
|
+
`symbol` field also returns CCXT format.
|
|
172
|
+
- ccxt provider: response `exchange_id` field returns the exchange-native ID.
|
|
173
|
+
- bitget_data provider: no `exchange_id` field; use `symbol` directly.
|
|
174
|
+
|
|
175
|
+
**How to resolve an unknown symbol:**
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
rows = data.crypto.market(symbol="BTC/USDT", exchange="bitget",
|
|
179
|
+
market_type="perpetual").to_dataframe()
|
|
180
|
+
# ccxt provider response:
|
|
181
|
+
exchange_id = rows["exchange_id"].iloc[0] # → "BTCUSDT"
|
|
182
|
+
unified = rows["symbol"].iloc[0] # → "BTC/USDT:USDT"
|
|
183
|
+
# bitget_data provider response: no exchange_id field;
|
|
184
|
+
# use unified = rows["symbol"].iloc[0] directly
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Use `exchange_id` (ccxt only) when calling kline / taker_volume / funding_rate etc.
|
|
188
|
+
Use the `symbol` (unified) when passing to `manifest.trading_symbols` and
|
|
189
|
+
`backtest.yaml` instruments.
|
|
190
|
+
|
|
191
|
+
- Do not mix the two formats. Do not pass `"BTC/USDT:USDT"` to `kline`
|
|
192
|
+
and do not pass `"BTCUSDT"` to `crypto.market(symbol=...)`.
|
|
193
|
+
- When the parameter note is ambiguous (just says "Symbol to get data for"),
|
|
194
|
+
default to exchange-native format for all `crypto.futures.*` /
|
|
195
|
+
`crypto.spot.*` endpoints.
|
|
196
|
+
|
|
197
|
+
### Parameter compliance
|
|
198
|
+
|
|
199
|
+
- Pass only parameters that appear in the endpoint's documented signature.
|
|
200
|
+
Never add undocumented kwargs.
|
|
201
|
+
- Required parameters (marked `yes` in the table) must always be supplied.
|
|
202
|
+
Optional parameters with a documented default may be omitted.
|
|
203
|
+
- Respect documented enum values exactly (e.g. `interval` must be one of
|
|
204
|
+
`5m`, `15m`, `1h`, `4h`, `1d` for kline endpoints; `market_type` must be
|
|
205
|
+
one of `spot`, `perpetual`, `future`, `option`).
|
|
206
|
+
- For paginated endpoints, respect the documented maximum `size`/`limit`
|
|
207
|
+
(e.g. `size ≤ 200` for `crypto.market`, `limit ≤ 1000` for klines).
|
|
208
|
+
Loop over pages when more data is needed rather than requesting beyond
|
|
209
|
+
the cap.
|
|
210
|
+
|
|
211
|
+
### Time ranges
|
|
212
|
+
|
|
213
|
+
- Use `start_time` / `end_time` (millisecond Unix-epoch integers) in
|
|
214
|
+
preference to the deprecated `start_date` / `end_date` string params.
|
|
215
|
+
- `crypto.futures.kline` and `crypto.spot.kline` cap **each request** at
|
|
216
|
+
**90 days** of data. This is a per-fetch API limit, not a backtest window
|
|
217
|
+
restriction — when the replay window is longer, fetch multiple 90-day
|
|
218
|
+
chunks and concatenate them.
|
|
219
|
+
- The canonical datetime column in SDK responses is `time`. Call
|
|
220
|
+
`data.to_dataframe(bars)` without `datetime_index` to let the SDK pick it;
|
|
221
|
+
only override when the endpoint's response fields table names a different
|
|
222
|
+
time column (e.g. `date`).
|
|
223
|
+
|
|
224
|
+
### Response handling
|
|
225
|
+
|
|
226
|
+
- Always convert `OBBject` responses with `data.to_dataframe()`,
|
|
227
|
+
`data.to_dict()`, or `data.to_records()` before accessing individual fields.
|
|
228
|
+
- Reference only field names that appear in the endpoint's **Response fields**
|
|
229
|
+
table. Never guess a field name from context.
|
|
230
|
+
- Fields documented as `string` from market info endpoints (e.g.
|
|
231
|
+
`min_order_qty`, `price_precision`) are decimal strings, not floats.
|
|
232
|
+
Cast explicitly when arithmetic is needed.
|
|
233
|
+
- Endpoints that return a context-only snapshot (no `time` column) cannot
|
|
234
|
+
be aligned into a replay feature frame. Use them as decision context only
|
|
235
|
+
and do not declare their fields in `backtest.yaml.data_requirements`.
|
|
236
|
+
|
|
237
|
+
### Endpoint discovery
|
|
238
|
+
|
|
239
|
+
- When in doubt which endpoint to use, read `catalog.md` for the domain
|
|
240
|
+
table, then read the domain file. Do not rely on memory or path guessing.
|
|
241
|
+
- Domain files are large (crypto.md ≈ 4000 lines). Jump to an endpoint
|
|
242
|
+
section with grep instead of reading the whole file, e.g.
|
|
243
|
+
`grep -n "crypto.futures.funding_rate" references/sdk/data/crypto.md`,
|
|
244
|
+
then read that section's parameter and response tables.
|
|
245
|
+
- `data.coverage.commands()` lists every available endpoint at runtime.
|
|
246
|
+
Use it programmatically if the domain file and catalog are insufficient.
|
|
247
|
+
- CoinGecko-based endpoints (`crypto.coin_info`, `crypto.coin_history`, etc.)
|
|
248
|
+
accept a **CoinGecko coin ID** (e.g. `"bitcoin"`), not a trading-pair symbol.
|
|
249
|
+
Futures/spot kline endpoints accept trading-pair symbols. These are
|
|
250
|
+
different namespaces — do not mix them.
|
|
101
251
|
|
|
102
252
|
## Hard Boundaries
|
|
103
253
|
|
|
@@ -111,6 +261,19 @@ Use the English equivalent when the user's first message is English.
|
|
|
111
261
|
- Do not call trade mutation APIs directly in a signal-only branch. Emit the
|
|
112
262
|
signal successfully and let the runtime decide whether follow-trade is
|
|
113
263
|
allowed.
|
|
264
|
+
- For `backtest_support: full`, never pass `provider=...`, and ensure any
|
|
265
|
+
`data_requirements.required_bar_fields` are actually built and referenced in
|
|
266
|
+
`src/**`. The `execution.start` / `execution.end` replay window is entirely
|
|
267
|
+
the author's choice — the platform never polices window presence, length,
|
|
268
|
+
or recency; the only hard rule is that evidence must be real, never
|
|
269
|
+
fabricated.
|
|
270
|
+
- Keep symbols consistent across `manifest.trading_symbols`, display text,
|
|
271
|
+
README, `backtest.yaml` instruments, data calls, and emitted signals. If the
|
|
272
|
+
submitted symbol is a typo or unavailable and you replace it with a supported
|
|
273
|
+
symbol, rename the package/title and explain the correction in README and the
|
|
274
|
+
final summary.
|
|
275
|
+
- In Nautilus strategy code, call `self.cancel_all_orders(instrument_id)` and
|
|
276
|
+
`self.close_all_positions(instrument_id)` with an explicit instrument id.
|
|
114
277
|
- Do not publish or enable without showing the endpoint and masked
|
|
115
278
|
`ACCESS-KEY` prefix and getting the user's intent for that operation.
|
|
116
279
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Confirm Playbook Draft
|
|
2
|
+
|
|
3
|
+
Confirm the final temporary Playbook artifact and save it as a draft. Use this
|
|
4
|
+
after the package has passed the required sandbox evaluation and the user agrees
|
|
5
|
+
that this is the version to keep.
|
|
6
|
+
|
|
7
|
+
## `POST /api/v1/playbook/confirm`
|
|
8
|
+
|
|
9
|
+
**Auth**: `ACCESS-KEY` header from the Bitget OpenAPI credential. Missing it returns 401.
|
|
10
|
+
|
|
11
|
+
**Content-Type**: `application/json`
|
|
12
|
+
|
|
13
|
+
### Request
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"temporary_id": "temporary-playbook-id"
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
For backward compatibility, the server also accepts `draft_id` or `playbook_id`
|
|
22
|
+
with the same value.
|
|
23
|
+
|
|
24
|
+
### Success Response
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"strategy_id": "strategy-...",
|
|
29
|
+
"draft_id": "draft-playbook-id",
|
|
30
|
+
"name": "btc-ema-crossover",
|
|
31
|
+
"status": "draft",
|
|
32
|
+
"suggested_version": "1.0.1"
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The id does not change during confirmation. The same package id that was used
|
|
37
|
+
for the final backtest becomes the draft id used by `publish`.
|
|
38
|
+
|
|
39
|
+
### When To Call
|
|
40
|
+
|
|
41
|
+
Call `confirm` only after:
|
|
42
|
+
|
|
43
|
+
1. local validation passed,
|
|
44
|
+
2. required sandbox backtests completed successfully,
|
|
45
|
+
3. you summarized the results for the user, and
|
|
46
|
+
4. the user accepted this package as the final draft to keep.
|
|
47
|
+
|
|
48
|
+
Do not confirm every failed iteration. Upload replaces older temporary artifacts
|
|
49
|
+
automatically; confirm is the boundary where the final package becomes visible
|
|
50
|
+
as a draft.
|
|
51
|
+
|
|
52
|
+
### Error Responses
|
|
53
|
+
|
|
54
|
+
| Status | Description |
|
|
55
|
+
|--------|-------------|
|
|
56
|
+
| 401 | Missing `ACCESS-KEY` header |
|
|
57
|
+
| 403 | Not the Playbook owner, access key revoked, or principal not found / inactive |
|
|
58
|
+
| 404 | temporary id not found |
|
|
59
|
+
| 409 | The package is neither `temporary` nor already `draft` |
|
|
@@ -11,19 +11,21 @@ Use these docs after the local package is ready. For Python imports inside
|
|
|
11
11
|
|
|
12
12
|
## Read order
|
|
13
13
|
|
|
14
|
-
1. [`upload.md`](upload.md) — upload a packaged Playbook archive
|
|
15
|
-
2. [`
|
|
16
|
-
3. [`
|
|
17
|
-
4. [`
|
|
18
|
-
5. [`
|
|
14
|
+
1. [`upload.md`](upload.md) — upload a temporary packaged Playbook archive
|
|
15
|
+
2. [`run.md`](run.md) — trigger a manual backtest/evaluation run
|
|
16
|
+
3. [`confirm.md`](confirm.md) — save the final temporary artifact as a draft
|
|
17
|
+
4. [`publish.md`](publish.md) — publish a validated draft Playbook
|
|
18
|
+
5. [`list.md`](list.md) and `detail` response docs — inspect public Playbooks
|
|
19
|
+
6. [`enable.md`](enable.md) and [`my-playbooks.md`](my-playbooks.md) — manage
|
|
19
20
|
subscriptions
|
|
20
|
-
|
|
21
|
+
7. [`error-responses.md`](error-responses.md) — common failure modes
|
|
21
22
|
|
|
22
23
|
## Control-plane docs
|
|
23
24
|
|
|
24
25
|
| Document | Purpose |
|
|
25
26
|
|---|---|
|
|
26
|
-
| [`upload.md`](upload.md) | Request format, package validation, and server-side checks |
|
|
27
|
+
| [`upload.md`](upload.md) | Request format, package validation, temporary artifact behavior, and server-side checks |
|
|
28
|
+
| [`confirm.md`](confirm.md) | Convert the accepted temporary artifact into a draft |
|
|
27
29
|
| [`publish.md`](publish.md) | Publish contract, evidence requirements, and 409 cases |
|
|
28
30
|
| [`run.md`](run.md) | Manual run contract and runtime gating |
|
|
29
31
|
| [`list.md`](list.md) | Public list surface |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Publish Playbook
|
|
2
2
|
|
|
3
|
-
Publish a draft Playbook to make it publicly available. Publishing is
|
|
4
|
-
step that assigns the formal public version number.
|
|
3
|
+
Publish a confirmed draft Playbook to make it publicly available. Publishing is
|
|
4
|
+
the only step that assigns the formal public version number.
|
|
5
5
|
|
|
6
6
|
## `POST /api/v1/playbook/publish`
|
|
7
7
|
|
|
@@ -22,6 +22,10 @@ step that assigns the formal public version number.
|
|
|
22
22
|
`minor`, and `major`. The server computes the final semver from the strategy's
|
|
23
23
|
latest published version; clients must not edit `manifest.version` manually.
|
|
24
24
|
|
|
25
|
+
New clients should call [`confirm.md`](confirm.md) before publish. For backward
|
|
26
|
+
compatibility, publishing a temporary id directly is accepted and the server
|
|
27
|
+
internally confirms it before assigning the published version.
|
|
28
|
+
|
|
25
29
|
### Success Response
|
|
26
30
|
|
|
27
31
|
```json
|
|
@@ -40,9 +44,9 @@ Only the Playbook owner can publish. Others receive 403.
|
|
|
40
44
|
|
|
41
45
|
### Publish Contract
|
|
42
46
|
|
|
43
|
-
Publishing freezes the draft artifact into an immutable version and
|
|
44
|
-
parent version within the same strategy tree. A published Playbook
|
|
45
|
-
stable public contract for:
|
|
47
|
+
Publishing freezes the confirmed draft artifact into an immutable version and
|
|
48
|
+
records its parent version within the same strategy tree. A published Playbook
|
|
49
|
+
should carry a stable public contract for:
|
|
46
50
|
|
|
47
51
|
- `decision_mode`
|
|
48
52
|
- `backtest_support`
|
|
@@ -55,6 +59,9 @@ stable public contract for:
|
|
|
55
59
|
- If `backtest_support = full`
|
|
56
60
|
- the current runtime must be able to execute it (`runtime_profile = deterministic`)
|
|
57
61
|
- the owner must first produce one successful historical evaluation run
|
|
62
|
+
- that run must include a real equity/NAV curve, not only aggregate metrics —
|
|
63
|
+
this is an anti-fabrication check, not a window check: curve density,
|
|
64
|
+
window length, and recency are never validated
|
|
58
65
|
- the Playbook should expose one official public backtest snapshot
|
|
59
66
|
- list / detail surfaces should use that snapshot, not an arbitrary recent run
|
|
60
67
|
- If `backtest_support = none`
|
|
@@ -73,4 +80,4 @@ performance is not.
|
|
|
73
80
|
| 401 | Missing `ACCESS-KEY` header |
|
|
74
81
|
| 403 | Not the Playbook owner, access key revoked, or principal not found / inactive |
|
|
75
82
|
| 404 | draft_id not found |
|
|
76
|
-
| 409 | Status is not draft; no successful historical evaluation exists for `backtest_support=full`; or runtime profile is not currently publishable |
|
|
83
|
+
| 409 | Status is not draft/temporary; no successful historical evaluation exists for `backtest_support=full`; or runtime profile is not currently publishable |
|
|
@@ -14,13 +14,13 @@ the run reaches `completed` or `failed`.
|
|
|
14
14
|
|
|
15
15
|
```json
|
|
16
16
|
{
|
|
17
|
-
"version_id": "draft-or-version-id"
|
|
17
|
+
"version_id": "temporary-draft-or-version-id"
|
|
18
18
|
}
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
### Supported Use Cases
|
|
22
22
|
|
|
23
|
-
- creator runs a draft or published Playbook to validate a new version
|
|
23
|
+
- creator runs a temporary, draft, or published Playbook to validate a new version
|
|
24
24
|
- any authenticated user runs a published Playbook evaluation when `backtest_support = full`
|
|
25
25
|
|
|
26
26
|
### Backtest Eligibility
|
|
@@ -40,7 +40,7 @@ fairly replayable on historical data.
|
|
|
40
40
|
{
|
|
41
41
|
"run_id": "e5f6g7h8-...",
|
|
42
42
|
"strategy_id": "strategy-...",
|
|
43
|
-
"version_id": "draft-or-version-id",
|
|
43
|
+
"version_id": "temporary-draft-or-version-id",
|
|
44
44
|
"status": "pending",
|
|
45
45
|
"dispatched": true
|
|
46
46
|
}
|
|
@@ -125,9 +125,9 @@ public backtest.
|
|
|
125
125
|
|
|
126
126
|
### Permissions
|
|
127
127
|
|
|
128
|
-
- Owner can run draft and published Playbooks they control
|
|
128
|
+
- Owner can run temporary, draft, and published Playbooks they control
|
|
129
129
|
- Any authenticated user can run published Playbooks when `backtest_support = full`
|
|
130
|
-
- Users must not be allowed to run draft versions they do not own
|
|
130
|
+
- Users must not be allowed to run temporary or draft versions they do not own
|
|
131
131
|
|
|
132
132
|
### Error Responses
|
|
133
133
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Upload Playbook
|
|
2
2
|
|
|
3
|
-
Upload a Playbook package
|
|
3
|
+
Upload a Playbook package to GetAgent Cloud as a temporary iteration artifact.
|
|
4
4
|
|
|
5
5
|
> Before dispatching this call, follow the **Endpoint Confirmation Discipline** in `SKILL.md` — echo a one-line preflight (`upload draft {name} → GetAgent prod https://api.bitget.com with ACCESS-KEY=<masked>`) and obtain the user's Bitget OpenAPI `ACCESS-KEY` if not already collected this session.
|
|
6
6
|
|
|
@@ -30,13 +30,31 @@ curl -X POST \
|
|
|
30
30
|
```json
|
|
31
31
|
{
|
|
32
32
|
"strategy_id": "strategy-...",
|
|
33
|
-
"draft_id": "
|
|
33
|
+
"draft_id": "temporary-playbook-id",
|
|
34
34
|
"name": "btc-ema-crossover",
|
|
35
|
-
"status": "
|
|
35
|
+
"status": "temporary",
|
|
36
36
|
"suggested_version": "1.0.1"
|
|
37
37
|
}
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
`draft_id` is the package id to pass to `run` during this iteration. It is
|
|
41
|
+
named `draft_id` for backward compatibility, but uploads now remain temporary
|
|
42
|
+
until confirmed.
|
|
43
|
+
|
|
44
|
+
### Temporary Artifact Behavior
|
|
45
|
+
|
|
46
|
+
- Every upload is persisted because backtests are asynchronous and run by
|
|
47
|
+
workers that load the package later by id.
|
|
48
|
+
- When a newer package for the same strategy is uploaded, GetAgent deletes the
|
|
49
|
+
previous temporary package record and package archive after any active run has
|
|
50
|
+
finished.
|
|
51
|
+
- Temporary packages are hidden from user-facing draft lists and "my creations".
|
|
52
|
+
- Once the package is final and acceptable to the user, call
|
|
53
|
+
[`confirm.md`](confirm.md) to convert the latest temporary package into a
|
|
54
|
+
real draft.
|
|
55
|
+
- Publishing a temporary package directly is accepted for older clients, but new
|
|
56
|
+
clients should call `confirm` before `publish` so the workflow is explicit.
|
|
57
|
+
|
|
40
58
|
### Server-side Validation
|
|
41
59
|
|
|
42
60
|
The server runs these checks on upload (client-side validation is not trusted):
|
|
@@ -49,7 +67,7 @@ The server runs these checks on upload (client-side validation is not trusted):
|
|
|
49
67
|
6. **backtest.yaml shape** — only valid when `backtest_support: full`; basic type checks enforced
|
|
50
68
|
7. **Syntax** — Python files under `src/**` must compile
|
|
51
69
|
8. **Import allowlist** — Only `getagent`, `pandas`, `numpy`, `json`, `math`, `datetime`, `pathlib`, `asyncio`, etc. Imports like `requests`, `subprocess`, `os` are blocked.
|
|
52
|
-
9. **Version assignment** — upload never consumes a public version. The server returns a `draft_id`; the formal version is assigned later by `publish`.
|
|
70
|
+
9. **Version assignment** — upload never consumes a public version. The server returns a temporary `draft_id`; the formal version is assigned later by `publish`.
|
|
53
71
|
10. **Local-only paths rejected** — `tests/`, `research/`, `data/`, `output/`, caches and virtualenv folders must not be included
|
|
54
72
|
|
|
55
73
|
### Error Responses
|