@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.
Files changed (38) hide show
  1. package/.claude-plugin/marketplace.json +15 -4
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/VERSION +1 -1
  4. package/package.json +1 -1
  5. package/skills/getagent/SKILL.md +169 -6
  6. package/skills/getagent/examples/btc-ema-cross-demo/backtest.yaml +4 -0
  7. package/skills/getagent/references/api/confirm.md +59 -0
  8. package/skills/getagent/references/api/index.md +9 -7
  9. package/skills/getagent/references/api/publish.md +13 -6
  10. package/skills/getagent/references/api/run.md +5 -5
  11. package/skills/getagent/references/api/upload.md +22 -4
  12. package/skills/getagent/references/backtest-engine.md +82 -152
  13. package/skills/getagent/references/package-schema.md +31 -8
  14. package/skills/getagent/references/sdk/backtest/catalog.md +17 -2
  15. package/skills/getagent/references/sdk/data/arxiv.md +8 -10
  16. package/skills/getagent/references/sdk/data/catalog.md +3 -8
  17. package/skills/getagent/references/sdk/data/commodity.md +71 -39
  18. package/skills/getagent/references/sdk/data/coverage.md +0 -3
  19. package/skills/getagent/references/sdk/data/crypto.md +1583 -402
  20. package/skills/getagent/references/sdk/data/currency.md +55 -15
  21. package/skills/getagent/references/sdk/data/derivatives.md +161 -50
  22. package/skills/getagent/references/sdk/data/economy.md +911 -259
  23. package/skills/getagent/references/sdk/data/equity.md +1719 -393
  24. package/skills/getagent/references/sdk/data/etf.md +550 -64
  25. package/skills/getagent/references/sdk/data/famafrench.md +38 -50
  26. package/skills/getagent/references/sdk/data/fixedincome.md +574 -139
  27. package/skills/getagent/references/sdk/data/imf_utils.md +0 -8
  28. package/skills/getagent/references/sdk/data/index.md +18 -32
  29. package/skills/getagent/references/sdk/data/news.md +128 -58
  30. package/skills/getagent/references/sdk/data/regulators.md +108 -43
  31. package/skills/getagent/references/sdk/data/sentiment.md +188 -34
  32. package/skills/getagent/references/sdk/data/uscongress.md +13 -21
  33. package/skills/getagent/references/sdk/data/web_search.md +3 -7
  34. package/skills/getagent/references/sdk/data/wikipedia.md +12 -18
  35. package/skills/getagent/references/sdk.md +14 -5
  36. package/skills/getagent/scripts/validate.py +109 -3
  37. package/skills/getagent/scripts/version_check.sh +13 -12
  38. 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.2.1"
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.2.1",
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": ["getagent", "trading", "playbooks", "backtesting", "agent-skills"],
23
+ "keywords": [
24
+ "getagent",
25
+ "trading",
26
+ "playbooks",
27
+ "backtesting",
28
+ "agent-skills"
29
+ ],
24
30
  "category": "external-integrations",
25
- "tags": ["trading", "backtesting", "agent-skills", "playbooks"]
31
+ "tags": [
32
+ "trading",
33
+ "backtesting",
34
+ "agent-skills",
35
+ "playbooks"
36
+ ]
26
37
  }
27
38
  ]
28
39
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "getagent",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Create, validate, upload, backtest, publish, and enable GetAgent quantitative trading Playbooks.",
5
5
  "author": {
6
6
  "name": "GetAgent",
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitget-ai/getagent-skill",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Install the official GetAgent Agent Skill for Playbook authoring.",
5
5
  "license": "Proprietary",
6
6
  "homepage": "https://github.com/Bitget-AI/getagent-skill#readme",
@@ -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.2.1
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
- conda activate get_agent_test
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/playbook-supported.md`
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
 
@@ -16,6 +16,10 @@ strategy:
16
16
  fast_period: 12
17
17
  slow_period: 26
18
18
 
19
+ execution:
20
+ start: "2024-01-01T00:00:00Z"
21
+ end: "2024-04-01T00:00:00Z"
22
+
19
23
  instrument:
20
24
  id: BTCUSDT.BINANCE
21
25
  kind: perpetual
@@ -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. [`publish.md`](publish.md) — publish a validated Playbook
16
- 3. [`run.md`](run.md) — trigger a manual backtest/evaluation run
17
- 4. [`list.md`](list.md) and `detail` response docs inspect public Playbooks
18
- 5. [`enable.md`](enable.md) and [`my-playbooks.md`](my-playbooks.md)manage
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
- 6. [`error-responses.md`](error-responses.md) — common failure modes
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 the only
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 records its
44
- parent version within the same strategy tree. A published Playbook should carry a
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 draft to GetAgent Cloud.
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": "draft-...",
33
+ "draft_id": "temporary-playbook-id",
34
34
  "name": "btc-ema-crossover",
35
- "status": "draft",
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