alphaspec 0.2.1__tar.gz → 0.3.0__tar.gz

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 (98) hide show
  1. {alphaspec-0.2.1 → alphaspec-0.3.0}/CHANGELOG.md +13 -0
  2. {alphaspec-0.2.1 → alphaspec-0.3.0}/PKG-INFO +2 -2
  3. {alphaspec-0.2.1 → alphaspec-0.3.0}/docs/ROADMAP.md +11 -12
  4. {alphaspec-0.2.1 → alphaspec-0.3.0}/docs/RUNTIME_API.md +60 -4
  5. {alphaspec-0.2.1 → alphaspec-0.3.0}/docs/SPEC.md +10 -3
  6. {alphaspec-0.2.1 → alphaspec-0.3.0}/pyproject.toml +1 -1
  7. alphaspec-0.3.0/schema/0.3/artifact.schema.json +847 -0
  8. alphaspec-0.3.0/schema/0.3/capabilities.schema.json +230 -0
  9. alphaspec-0.3.0/schema/0.3/common.schema.json +96 -0
  10. alphaspec-0.3.0/schema/0.3/evidence.schema.json +152 -0
  11. alphaspec-0.3.0/schema/0.3/gate-result.schema.json +154 -0
  12. alphaspec-0.3.0/schema/0.3/score.schema.json +79 -0
  13. {alphaspec-0.2.1 → alphaspec-0.3.0}/skills/alphaspec/SKILL.md +4 -2
  14. {alphaspec-0.2.1 → alphaspec-0.3.0}/src/alphaspec/__init__.py +1 -1
  15. {alphaspec-0.2.1 → alphaspec-0.3.0}/src/alphaspec/_resources.py +2 -2
  16. {alphaspec-0.2.1 → alphaspec-0.3.0}/src/alphaspec/cli.py +92 -5
  17. {alphaspec-0.2.1 → alphaspec-0.3.0}/src/alphaspec/client.py +33 -3
  18. {alphaspec-0.2.1 → alphaspec-0.3.0}/src/alphaspec/mcp_server.py +30 -6
  19. {alphaspec-0.2.1 → alphaspec-0.3.0}/src/alphaspec/validate.py +7 -2
  20. {alphaspec-0.2.1 → alphaspec-0.3.0}/tests/test_client.py +60 -0
  21. {alphaspec-0.2.1 → alphaspec-0.3.0}/tests/test_examples.py +21 -0
  22. {alphaspec-0.2.1 → alphaspec-0.3.0}/tests/test_mcp_server.py +2 -1
  23. {alphaspec-0.2.1 → alphaspec-0.3.0}/.github/workflows/ci.yml +0 -0
  24. {alphaspec-0.2.1 → alphaspec-0.3.0}/.github/workflows/pages.yml +0 -0
  25. {alphaspec-0.2.1 → alphaspec-0.3.0}/.github/workflows/release.yml +0 -0
  26. {alphaspec-0.2.1 → alphaspec-0.3.0}/.gitignore +0 -0
  27. {alphaspec-0.2.1 → alphaspec-0.3.0}/LICENSE +0 -0
  28. {alphaspec-0.2.1 → alphaspec-0.3.0}/README.md +0 -0
  29. {alphaspec-0.2.1 → alphaspec-0.3.0}/README.zh-CN.md +0 -0
  30. {alphaspec-0.2.1 → alphaspec-0.3.0}/catalog/i18n/en.json +0 -0
  31. {alphaspec-0.2.1 → alphaspec-0.3.0}/catalog/indicators.json +0 -0
  32. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/README.md +0 -0
  33. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as001-unresolved-indicator.json +0 -0
  34. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as002-unresolved-param.json +0 -0
  35. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as003-htf-live-lookahead.json +0 -0
  36. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as004-indicator-cycle.json +0 -0
  37. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as005-unknown-type.json +0 -0
  38. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as006-unknown-param.json +0 -0
  39. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as007-cn-indicator-on-us-market.json +0 -0
  40. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as008-primary-only-timeframe-ignored.json +0 -0
  41. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as009-finer-than-primary.json +0 -0
  42. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as010-tick-timeframe.json +0 -0
  43. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as011-missing-suffix.json +0 -0
  44. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as012-ai-without-search-trials.json +0 -0
  45. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as013-exits-replace-exit-rule.json +0 -0
  46. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as013-no-exit.json +0 -0
  47. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as014-intraday-on-daily.json +0 -0
  48. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as015-unused-indicator.json +0 -0
  49. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as016-arm-without-trailing.json +0 -0
  50. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as017-entry-above-symbol-cap.json +0 -0
  51. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as017-not-for-atr-risk.json +0 -0
  52. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as018-scale-in-no-room.json +0 -0
  53. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as101-duplicate-symbol.json +0 -0
  54. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as102-all-null.json +0 -0
  55. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as103-asof-future.json +0 -0
  56. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as104-zero-as-missing.json +0 -0
  57. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/as105-weights-over-one.json +0 -0
  58. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-bare-number-operand.json +0 -0
  59. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-exit-zero.json +0 -0
  60. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-fill-timing-unknown.json +0 -0
  61. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-no-code-fields.json +0 -0
  62. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-noncanonical-timeframe.json +0 -0
  63. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-not-uses-rule.json +0 -0
  64. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-scale-in-averaging-down.json +0 -0
  65. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-score-without-direction.json +0 -0
  66. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-scores-and-weights.json +0 -0
  67. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-sizing-unsupported-mode.json +0 -0
  68. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-sizing-without-target.json +0 -0
  69. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-trade-settings-in-0.1.json +0 -0
  70. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/schema-universe-mode-conflict.json +0 -0
  71. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/score-valid.json +0 -0
  72. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/valid-minimal.json +0 -0
  73. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/valid-sizing-atr-pyramid.json +0 -0
  74. {alphaspec-0.2.1 → alphaspec-0.3.0}/conformance/cases/valid-trade-settings.json +0 -0
  75. {alphaspec-0.2.1 → alphaspec-0.3.0}/docs/MARKETS.md +0 -0
  76. {alphaspec-0.2.1 → alphaspec-0.3.0}/docs/RULES.md +0 -0
  77. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/artifacts/01-ema-cross-us-equity.json +0 -0
  78. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/artifacts/02-rsi-reversion-params.json +0 -0
  79. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/artifacts/03-mtf-trend-pullback.json +0 -0
  80. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/artifacts/04-breakout-retest-sequence.json +0 -0
  81. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/artifacts/05-cn-limit-up-pullback.json +0 -0
  82. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/artifacts/06-trend-with-trade-settings.json +0 -0
  83. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/scores/01-model-scores-cn-stock.json +0 -0
  84. {alphaspec-0.2.1 → alphaspec-0.3.0}/examples/scores/02-target-weights-us-equity.json +0 -0
  85. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.1/artifact.schema.json +0 -0
  86. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.1/common.schema.json +0 -0
  87. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.1/evidence.schema.json +0 -0
  88. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.1/gate-result.schema.json +0 -0
  89. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.1/score.schema.json +0 -0
  90. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.2/artifact.schema.json +0 -0
  91. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.2/common.schema.json +0 -0
  92. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.2/evidence.schema.json +0 -0
  93. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.2/gate-result.schema.json +0 -0
  94. {alphaspec-0.2.1 → alphaspec-0.3.0}/schema/0.2/score.schema.json +0 -0
  95. {alphaspec-0.2.1 → alphaspec-0.3.0}/src/alphaspec/lints.py +0 -0
  96. {alphaspec-0.2.1 → alphaspec-0.3.0}/tests/test_cli_reference.py +0 -0
  97. {alphaspec-0.2.1 → alphaspec-0.3.0}/tests/test_conformance.py +0 -0
  98. {alphaspec-0.2.1 → alphaspec-0.3.0}/tools/export_indicator_catalog.py +0 -0
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 — 2026-10-12
4
+
5
+ - Contract 0.3 (`schema/0.3/`): new `capabilities` document kind; `gate-result.tradeSettings` reports the exits,
6
+ sizing and execution an evaluation actually used and every value the runtime defaulted. Artifacts are unchanged
7
+ from 0.2.
8
+ - Validator accepts 0.1, 0.2 and 0.3; a kind that does not exist in the declared version is `UNSUPPORTED_KIND`.
9
+ - Client / CLI / MCP: `capabilities`, `strategies`, `export` (`export_strategy`), and `promote --target`
10
+ (`target_strategy_id`) to publish a passing modification as a new version of an existing strategy.
11
+ - RUNTIME_API: the capabilities endpoint, submission checks (`RUNTIME_*` codes, no quota used), export and
12
+ write-back. Skill: check capabilities before writing; export–edit–resubmit flow.
13
+ - Reference runtime: markets whose history does not cover the evaluation window are rejected at submission
14
+ instead of being backtested on a silently shorter in-sample; symbols with no bars in the window are rejected.
15
+
3
16
  ## 0.2.1 — 2026-10-11
4
17
 
5
18
  Semantics clarified to match what a runtime can apply the same way in backtests and live trading:
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: alphaspec
3
- Version: 0.2.1
3
+ Version: 0.3.0
4
4
  Summary: The auditable contract between alpha and execution: JSON schemas, a validator and lint rules for declarative trading strategies.
5
5
  Project-URL: Homepage, https://github.com/openalpha-dev/alphaspec
6
6
  Project-URL: Documentation, https://github.com/openalpha-dev/alphaspec#readme
7
7
  Project-URL: Changelog, https://github.com/openalpha-dev/alphaspec/blob/main/CHANGELOG.md
8
- Project-URL: Schemas, https://openalpha-dev.github.io/alphaspec/schema/0.2/
8
+ Project-URL: Schemas, https://openalpha-dev.github.io/alphaspec/schema/0.3/
9
9
  Author: OpenAlpha contributors
10
10
  License-Expression: Apache-2.0
11
11
  License-File: LICENSE
@@ -37,14 +37,15 @@ Everything a strategy needs beyond its signal, in three optional blocks next to
37
37
 
38
38
  The per-symbol cap stays where it was, `riskProfile.maxSymbolExposurePct`.
39
39
 
40
- ## 0.3 — Capabilities
40
+ ## 0.3 — Capabilities and round trip (done)
41
41
 
42
- A runtime publishes what it can do so an agent can plan before it writes:
43
-
44
- - markets with data, timeframes per market, indicator profiles available per market;
45
- - universe modes, benchmark used for out-of-sample comparison, where a passing strategy can be
46
- promoted (paper account type per market);
47
- - `alphaspec capabilities` and an MCP tool; the Skill checks capabilities first.
42
+ - `capabilities` document: per market, whether daily / intraday history covers the evaluation
43
+ window (and why not), usable indicator profiles, promotability, out-of-sample benchmark,
44
+ evaluation windows and quota. `alphaspec capabilities`, MCP `get_capabilities`; the Skill reads it first.
45
+ - Runtimes reject at submission what they cannot run (`RUNTIME_*` codes), without using quota.
46
+ - `gate-result.tradeSettings`: the exits, sizing and execution actually used, and every default.
47
+ - Export: a runtime exports a strategy it holds as an artifact; a passing modification can be
48
+ promoted as a new version of it (`targetStrategyId`).
48
49
 
49
50
  ## 0.4 — Direction and derivatives
50
51
 
@@ -64,9 +65,7 @@ A runtime publishes what it can do so an agent can plan before it writes:
64
65
  - Whole-market universes with filters (listing age, liquidity, market cap, exclusions).
65
66
  - Dynamic universes defined by screening conditions and re-evaluated on a schedule.
66
67
 
67
- ## Round trip and evidence
68
+ ## Evidence
68
69
 
69
- - **Export**: a runtime can export any strategy it holds as AlphaSpec, so an agent can read,
70
- modify and resubmit an existing strategy; promotion can target a new version of it.
71
- - **Evidence**: execution evidence (rejections, slippage, fills, drift from target) returned as
72
- `evidence` documents for promoted strategies.
70
+ - Execution evidence (rejections, slippage, fills, drift from target) returned as `evidence`
71
+ documents for promoted strategies.
@@ -14,12 +14,50 @@ prefix.
14
14
 
15
15
  | Method & path | Success | Other responses |
16
16
  |---|---|---|
17
- | `GET /whoami` | 200 identity, `contractVersion` (latest) and `contractVersions` (all accepted), what the key can and cannot do | 401 invalid / revoked / expired key |
18
- | `POST /artifacts` — body: an `artifact` document | 201 `{artifactId, warnings}` | 422 `{issues}` (same codes as the local validator) · 400 unusable universe |
17
+ | `GET /whoami` | 200 identity, `contractVersion` (latest) and `contractVersions` (all accepted), today's `evaluationQuota`, what the key can and cannot do | 401 invalid / revoked / expired key |
18
+ | `GET /capabilities` | 200 `capabilities` document (contract 0.3): what can be evaluated and promoted right now | |
19
+ | `POST /artifacts` — body: an `artifact` document | 201 `{artifactId, warnings}` | 422 `{issues}` (validator codes, plus `RUNTIME_*` codes below) · 400 unusable universe |
19
20
  | `GET /artifacts` | 200 your submissions, newest first, with the latest verdict | |
20
- | `POST /artifacts/{id}/evaluate` | 202 `{evaluationId, status}` | 429 daily evaluation quota used up · 503 queue full |
21
+ | `POST /artifacts/{id}/evaluate` | 202 `{evaluationId, status}` | 422 `{issues}` the runtime cannot run it (not counted against the quota) · 429 daily evaluation quota used up · 503 queue full |
21
22
  | `GET /artifacts/{id}/gate-result` | 200 `gate-result` document | 202 still running · 409 `{status: FAILED, error}` |
22
- | `POST /artifacts/{id}/promote` — body optional: `{name}` | 201 `{strategyId, created, enabled: false}` · 200 if already promoted | 400 gate not passed · runtime product rules (market, pool size, names) apply as in its UI |
23
+ | `POST /artifacts/{id}/promote` — body optional: `{name, targetStrategyId}` | 201 `{strategyId, created, enabled: false}` · 200 if already promoted · 200 `{updated: true}` with `targetStrategyId` | 400 gate not passed, market not promotable, or target's market / universe differs · runtime product rules (pool size, names) apply as in its UI |
24
+ | `GET /strategies` | 200 your existing strategies | |
25
+ | `GET /strategies/{id}/alphaspec` | 200 `{document, issues}` — an artifact you can edit and resubmit | 422 `{document, issues}` exported but does not validate (e.g. a factor strategy before 0.4) |
26
+
27
+ ## Capabilities
28
+
29
+ `GET /capabilities` is computed from the runtime's live market data and changes as data is added. For
30
+ every market it says whether the **daily** and **intraday** evaluation windows are covered by history
31
+ (and, when not, how much history exists versus how much the window needs), which indicator profiles an
32
+ evaluation can use there, whether a passing strategy can be promoted, and which index the out-of-sample
33
+ segment is compared against. Read it before writing a document; the Skill does.
34
+
35
+ The reference runtime's rules:
36
+
37
+ - A market is evaluable on a timeframe tier when its bars reach back to the start of that tier's
38
+ in-sample window and are current. Today that is China A-shares, ETFs on daily bars; other markets
39
+ have months, not years, of history and are declared not evaluable until it is backfilled.
40
+ - Indicator profiles: `core` everywhere; `ext.cn` on `cn_*`; `ext.data` on `cn_stock` (the fundamentals and
41
+ index datasets cover A-shares only); `ext.l2` nowhere (it needs order-book data a bar backtest does not have).
42
+ - Out-of-sample benchmark: CSI 300 for `cn_stock`, `cn_etf`, `cn_convbond`; other markets are judged on an
43
+ absolute Sharpe floor.
44
+ - Promotable markets: `cn_stock`, `cn_etf`, `cn_convbond`. Other evaluable markets return a gate result
45
+ but cannot be promoted.
46
+
47
+ ### Checks at submission
48
+
49
+ These run on `POST /artifacts` and again before `evaluate` enqueues. Errors reject the document (422)
50
+ and do not use the evaluation quota.
51
+
52
+ | code | severity | meaning |
53
+ |---|---|---|
54
+ | `RUNTIME_MARKET_UNSUPPORTED` | error | the runtime does not run this market |
55
+ | `RUNTIME_NO_HISTORY` | error | the market's bars do not cover the evaluation window for this timeframe (or `tick`) |
56
+ | `RUNTIME_PROFILE_UNAVAILABLE` | error | an indicator's profile is not usable in an evaluation on this market |
57
+ | `RUNTIME_UNIVERSE_MODE` | error | `ALL_MARKET` or no universe (until 0.4) |
58
+ | `RUNTIME_SYMBOL_NO_DATA` | error | a listed symbol has no bars in the window — almost always a typo |
59
+ | `RUNTIME_SYMBOL_PARTIAL_HISTORY` | warning | a symbol's history starts more than a month after the window does (its in-sample is shorter) |
60
+ | `RUNTIME_NOT_PROMOTABLE` | warning | evaluable, but a passing strategy cannot be promoted on this runtime |
23
61
 
24
62
  ## Evaluation
25
63
 
@@ -66,6 +104,11 @@ The evaluation backtest and the promoted strategy use the same `exits`, `sizing`
66
104
  signals. Always send a `sizing` block if position size matters to your result — it usually
67
105
  does.
68
106
 
107
+ The gate result (contract 0.3) reports what was actually used in `tradeSettings`: the effective
108
+ `exits`, `sizing` and `execution`, and under `defaults` every field the runtime filled in. When the
109
+ default sizing cannot be written as an AlphaSpec `sizing` block, `sizing` is absent and the `/sizing`
110
+ default says in words how positions were sized, with the limits that applied.
111
+
69
112
  "Out-of-sample" here means *chosen by the platform*, not *unseen at submission*: recent
70
113
  market data is public. The only truly unseen period is the one after you submit, which is
71
114
  what paper trading is for.
@@ -81,6 +124,14 @@ and dropped. The promoted strategy therefore carries no `params`; your submitted
81
124
  its parameters, stays attached to the artifact. Trade settings are carried over unchanged and show
82
125
  up in the runtime's strategy builder as its stop, position-size and fill-timing settings.
83
126
 
127
+ ### Updating an existing strategy
128
+
129
+ `GET /strategies/{id}/alphaspec` exports one of your strategies (rules, trade settings, risk limits,
130
+ universe) as an artifact. Edit it, submit it as a new artifact (count it in `searchTrials`), evaluate,
131
+ and promote with `targetStrategyId` to publish it as a new version of that strategy. Market and
132
+ universe must stay the same; change those in the runtime's UI or promote to a new strategy instead.
133
+ Factor strategies and long/short rule sets cannot be exported before contract 0.4.
134
+
84
135
  ## Python
85
136
 
86
137
  ```python
@@ -92,4 +143,9 @@ c.evaluate(aid)
92
143
  gate = c.wait(aid) # polls until done
93
144
  if gate["passed"]:
94
145
  c.promote(aid, name="my strategy")
146
+
147
+ c.capabilities() # what can be evaluated right now
148
+ doc, issues = c.export_strategy(438)
149
+ # ... edit doc, submit, evaluate ...
150
+ c.promote(new_aid, target_strategy_id=438)
95
151
  ```
@@ -1,4 +1,4 @@
1
- # AlphaSpec 0.2 — semantics
1
+ # AlphaSpec 0.3 — semantics
2
2
 
3
3
  The JSON Schemas in `schema/<version>/` define the shape of each document. This page defines
4
4
  what the fields **mean**, where the shape alone cannot. Where this page and a runtime
@@ -14,11 +14,18 @@ Every document has `contractVersion` and `kind`.
14
14
  | `score` | model / research pipeline | cross-sectional scores or target weights (L1) |
15
15
  | `gate-result` | runtime | the verdict on a submission |
16
16
  | `evidence` | runtime | what happened when it ran |
17
+ | `capabilities` | runtime | what it can evaluate and promote right now (0.3) |
17
18
 
18
19
  A runtime must refuse a `contractVersion` it does not implement rather than guess.
19
20
  Versions are additive: a document is validated against the schemas of the version it
20
- declares, so a `0.1` document carrying `0.2` fields is rejected, not half-read. Use `0.2`
21
- when you need trade settings (section 4a).
21
+ declares, so a `0.1` document carrying `0.2` fields is rejected, not half-read. Use `0.2` or
22
+ later when you need trade settings (section 4a). 0.3 adds no artifact fields; it adds the
23
+ `capabilities` document and `tradeSettings` in gate results.
24
+
25
+ A runtime must not accept a document it cannot run as written. When its data or features fall
26
+ short (a market without enough history, an indicator it cannot compute in a backtest), it rejects
27
+ at submission and says why; it publishes those limits in its `capabilities` document so an author
28
+ can check before writing.
22
29
 
23
30
  ## 2. Time
24
31
 
@@ -27,7 +27,7 @@ dependencies = [
27
27
  Homepage = "https://github.com/openalpha-dev/alphaspec"
28
28
  Documentation = "https://github.com/openalpha-dev/alphaspec#readme"
29
29
  Changelog = "https://github.com/openalpha-dev/alphaspec/blob/main/CHANGELOG.md"
30
- Schemas = "https://openalpha-dev.github.io/alphaspec/schema/0.2/"
30
+ Schemas = "https://openalpha-dev.github.io/alphaspec/schema/0.3/"
31
31
 
32
32
  [project.optional-dependencies]
33
33
  mcp = ["mcp>=1.2"]