@volter/twin-sentry 0.1.36 → 1.0.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 (188) hide show
  1. package/README.md +21 -134
  2. package/api/spec/SOURCE.md +15 -0
  3. package/api/spec/doc-examples.json +12 -0
  4. package/api/spec/openapi.json.gz +0 -0
  5. package/api/spec/patches.json +5350 -0
  6. package/api/spec/sources.json +122 -0
  7. package/api/src/fetch.ts +18 -0
  8. package/api/src/generated/surface.gen.json +1 -0
  9. package/api/src/generated/ui.gen.json +1 -0
  10. package/api/src/index.ts +3 -0
  11. package/api/src/manifest.ts +136 -0
  12. package/api/src/semantics/api.ts +246 -0
  13. package/api/src/semantics/around.ts +36 -0
  14. package/api/src/semantics/doors.ts +50 -0
  15. package/api/src/semantics/index.ts +19 -0
  16. package/api/src/semantics/shared.ts +35 -0
  17. package/api/src/semantics/states.ts +17 -0
  18. package/dist/api/spec/SOURCE.md +15 -0
  19. package/dist/api/spec/doc-examples.json +12 -0
  20. package/dist/api/spec/openapi.json.gz +0 -0
  21. package/dist/api/spec/patches.json +5350 -0
  22. package/dist/api/spec/sources.json +122 -0
  23. package/dist/api/src/fetch.d.ts +2 -0
  24. package/dist/api/src/fetch.js +17 -0
  25. package/dist/api/src/fetch.ts +18 -0
  26. package/dist/api/src/generated/surface.gen.json +1 -0
  27. package/dist/api/src/generated/ui.gen.json +1 -0
  28. package/dist/api/src/index.d.ts +2 -0
  29. package/dist/api/src/index.js +3 -0
  30. package/dist/api/src/index.ts +3 -0
  31. package/dist/api/src/manifest.d.ts +2 -0
  32. package/dist/api/src/manifest.js +135 -0
  33. package/dist/api/src/manifest.ts +136 -0
  34. package/dist/api/src/semantics/api.d.ts +13 -0
  35. package/dist/api/src/semantics/api.js +267 -0
  36. package/dist/api/src/semantics/api.ts +246 -0
  37. package/dist/api/src/semantics/around.d.ts +2 -0
  38. package/dist/api/src/semantics/around.js +41 -0
  39. package/dist/api/src/semantics/around.ts +36 -0
  40. package/dist/api/src/semantics/doors.d.ts +8 -0
  41. package/dist/api/src/semantics/doors.js +39 -0
  42. package/dist/api/src/semantics/doors.ts +50 -0
  43. package/dist/api/src/semantics/index.d.ts +2 -0
  44. package/dist/api/src/semantics/index.js +15 -0
  45. package/dist/api/src/semantics/index.ts +19 -0
  46. package/dist/api/src/semantics/shared.d.ts +15 -0
  47. package/dist/api/src/semantics/shared.js +27 -0
  48. package/dist/api/src/semantics/shared.ts +35 -0
  49. package/dist/api/src/semantics/states.d.ts +24 -0
  50. package/dist/api/src/semantics/states.js +17 -0
  51. package/dist/api/src/semantics/states.ts +17 -0
  52. package/dist/generated/pack-facts.json +87 -0
  53. package/dist/ingest/spec/SOURCE.md +30 -0
  54. package/dist/ingest/spec/authentication.mdx.gz +0 -0
  55. package/dist/ingest/spec/compression.mdx.gz +0 -0
  56. package/dist/ingest/spec/doc-examples.json +216 -0
  57. package/dist/ingest/spec/envelope-items.mdx.gz +0 -0
  58. package/dist/ingest/spec/envelopes.mdx.gz +0 -0
  59. package/dist/ingest/spec/openapi.json +178 -0
  60. package/dist/ingest/spec/rate-limiting.mdx.gz +0 -0
  61. package/dist/ingest/spec/sources.json +25 -0
  62. package/dist/ingest/spec/transport.mdx.gz +0 -0
  63. package/dist/ingest/spec/write-spec.ts +192 -0
  64. package/dist/ingest/src/fetch.d.ts +2 -0
  65. package/dist/ingest/src/fetch.js +15 -0
  66. package/dist/ingest/src/fetch.ts +16 -0
  67. package/dist/ingest/src/generated/surface.gen.json +1 -0
  68. package/dist/ingest/src/generated/ui.gen.json +1 -0
  69. package/dist/ingest/src/index.d.ts +2 -0
  70. package/dist/ingest/src/index.js +3 -0
  71. package/dist/ingest/src/index.ts +3 -0
  72. package/dist/ingest/src/manifest.d.ts +2 -0
  73. package/dist/ingest/src/manifest.js +34 -0
  74. package/dist/ingest/src/manifest.ts +39 -0
  75. package/dist/ingest/src/semantics/api.d.ts +2 -0
  76. package/dist/ingest/src/semantics/api.js +240 -0
  77. package/dist/ingest/src/semantics/api.ts +188 -0
  78. package/dist/ingest/src/semantics/around.d.ts +2 -0
  79. package/dist/ingest/src/semantics/around.js +6 -0
  80. package/dist/ingest/src/semantics/around.ts +7 -0
  81. package/dist/ingest/src/semantics/index.d.ts +2 -0
  82. package/dist/ingest/src/semantics/index.js +4 -0
  83. package/dist/ingest/src/semantics/index.ts +8 -0
  84. package/dist/ingest/src/semantics/shared.d.ts +4 -0
  85. package/dist/ingest/src/semantics/shared.js +2 -0
  86. package/dist/ingest/src/semantics/shared.ts +7 -0
  87. package/dist/ingest/src/semantics/states.d.ts +1 -0
  88. package/dist/ingest/src/semantics/states.js +2 -0
  89. package/dist/ingest/src/semantics/states.ts +2 -0
  90. package/dist/journeys/coverage.json +205 -0
  91. package/dist/journeys/customer-life.json +923 -0
  92. package/dist/journeys/customer-life.outline.md +51 -0
  93. package/dist/journeys/decisions.json +170 -0
  94. package/dist/journeys/demand.json +136 -0
  95. package/dist/journeys/score.json +231 -0
  96. package/dist/journeys/unreachable.json +29 -0
  97. package/dist/journeys/vendor-examples.json +474 -0
  98. package/dist/spec/sources.json +76 -0
  99. package/dist/src/cli.js +12 -27
  100. package/dist/src/fetch.d.ts +2 -0
  101. package/dist/src/fetch.js +9 -0
  102. package/dist/src/index.d.ts +5 -15
  103. package/dist/src/index.js +12 -75
  104. package/dist/src/manifest.d.ts +2 -0
  105. package/dist/src/manifest.js +34 -0
  106. package/dist/src/semantics/shared.d.ts +87 -0
  107. package/dist/src/semantics/shared.js +411 -0
  108. package/dist/src/server.d.ts +7 -0
  109. package/dist/src/server.js +7 -0
  110. package/generated/pack-facts.json +87 -0
  111. package/ingest/spec/SOURCE.md +30 -0
  112. package/ingest/spec/authentication.mdx.gz +0 -0
  113. package/ingest/spec/compression.mdx.gz +0 -0
  114. package/ingest/spec/doc-examples.json +216 -0
  115. package/ingest/spec/envelope-items.mdx.gz +0 -0
  116. package/ingest/spec/envelopes.mdx.gz +0 -0
  117. package/ingest/spec/openapi.json +178 -0
  118. package/ingest/spec/rate-limiting.mdx.gz +0 -0
  119. package/ingest/spec/sources.json +25 -0
  120. package/ingest/spec/transport.mdx.gz +0 -0
  121. package/ingest/spec/write-spec.ts +192 -0
  122. package/ingest/src/fetch.ts +16 -0
  123. package/ingest/src/generated/surface.gen.json +1 -0
  124. package/ingest/src/generated/ui.gen.json +1 -0
  125. package/ingest/src/index.ts +3 -0
  126. package/ingest/src/manifest.ts +39 -0
  127. package/ingest/src/semantics/api.ts +188 -0
  128. package/ingest/src/semantics/around.ts +7 -0
  129. package/ingest/src/semantics/index.ts +8 -0
  130. package/ingest/src/semantics/shared.ts +7 -0
  131. package/ingest/src/semantics/states.ts +2 -0
  132. package/journeys/coverage.json +205 -0
  133. package/journeys/customer-life.json +923 -0
  134. package/journeys/customer-life.outline.md +51 -0
  135. package/journeys/decisions.json +170 -0
  136. package/journeys/demand.json +136 -0
  137. package/journeys/score.json +231 -0
  138. package/journeys/unreachable.json +29 -0
  139. package/journeys/vendor-examples.json +474 -0
  140. package/package.json +16 -42
  141. package/spec/sources.json +76 -0
  142. package/src/cli.ts +12 -24
  143. package/src/fetch.ts +10 -0
  144. package/src/index.ts +12 -143
  145. package/src/manifest.ts +40 -0
  146. package/src/semantics/shared.ts +443 -0
  147. package/src/server.ts +8 -0
  148. package/client/sentry-mirror.css +0 -99
  149. package/client/sentry-mirror.tsx +0 -352
  150. package/dist/client/sentry-mirror.bundle.js +0 -388
  151. package/dist/client/sentry-mirror.css +0 -99
  152. package/dist/client/sentry-mirror.d.ts +0 -17
  153. package/dist/client/sentry-mirror.js +0 -156
  154. package/dist/client/sentry-mirror.tsx +0 -352
  155. package/dist/src/sentry-budget.d.ts +0 -50
  156. package/dist/src/sentry-budget.js +0 -145
  157. package/dist/src/sentry-capabilities.d.ts +0 -3
  158. package/dist/src/sentry-capabilities.js +0 -1180
  159. package/dist/src/sentry-conformance.d.ts +0 -22
  160. package/dist/src/sentry-conformance.js +0 -97
  161. package/dist/src/sentry-connector.d.ts +0 -77
  162. package/dist/src/sentry-connector.js +0 -226
  163. package/dist/src/sentry-events.d.ts +0 -54
  164. package/dist/src/sentry-events.js +0 -132
  165. package/dist/src/sentry-ingest.d.ts +0 -137
  166. package/dist/src/sentry-ingest.js +0 -387
  167. package/dist/src/sentry-mirror-ui.d.ts +0 -38
  168. package/dist/src/sentry-mirror-ui.js +0 -162
  169. package/dist/src/sentry-perform-harness.d.ts +0 -9
  170. package/dist/src/sentry-perform-harness.js +0 -20
  171. package/dist/src/sentry-server.d.ts +0 -14
  172. package/dist/src/sentry-server.js +0 -27
  173. package/dist/src/sentry-twin.d.ts +0 -17
  174. package/dist/src/sentry-twin.js +0 -1739
  175. package/dist/test-fixtures/sentry-openapi-operations.SOURCE.md +0 -24
  176. package/dist/test-fixtures/sentry-openapi-operations.json +0 -1837
  177. package/src/sentry-budget.ts +0 -171
  178. package/src/sentry-capabilities.ts +0 -1222
  179. package/src/sentry-conformance.ts +0 -110
  180. package/src/sentry-connector.ts +0 -260
  181. package/src/sentry-events.ts +0 -172
  182. package/src/sentry-ingest.ts +0 -471
  183. package/src/sentry-mirror-ui.ts +0 -162
  184. package/src/sentry-perform-harness.ts +0 -19
  185. package/src/sentry-server.ts +0 -35
  186. package/src/sentry-twin.ts +0 -1615
  187. package/test-fixtures/sentry-openapi-operations.SOURCE.md +0 -24
  188. package/test-fixtures/sentry-openapi-operations.json +0 -1837
package/README.md CHANGED
@@ -1,142 +1,29 @@
1
1
  # @volter/twin-sentry
2
2
 
3
- A local **Sentry** twin — a faithful, stateful local Sentry error-monitoring API your real
4
- `@sentry/node` SDK talks to **unmodified**. Point your SDK's DSN at the twin and a normal
5
- `Sentry.captureException()` lands an event that the twin **groups into an issue**; browse the
6
- issues/events/releases through the real Web API (`/api/0/...`) or the dashboard mirror.
7
- Mirror real Sentry, simulate, and fork. Built on `@volter/world-core`.
3
+ Sentry's Protocol 3 twin serves the demanded applications in [journeys/demand.json](./journeys/demand.json).
4
+ The API and ingest share one vendor store.
8
5
 
9
- It is **two API families over one local event-sourced state** (the `@volter/world-core` kernel):
6
+ | Wire | Behavior | Evidence |
7
+ |---|---|---|
8
+ | DSN hosts, `POST /api/<project>/envelope/` | Error/message events and issues, transactions, sessions, client reports, attachments, replay, profiles, cron check-ins and monitor configuration, feedback, logs and metrics. Receipt bytes and unknown items are retained in blobs. Plain, gzip, deflate, brotli and zstd requests; browser CORS. | [ingest/spec](./ingest/spec/SOURCE.md), with retained reference bytes and an offline writer |
9
+ | `sentry.io`, `us.sentry.io`, `de.sentry.io` | sentry-cli release creation, finalization, commits and previous-release lookup, repository listing and source-map chunk/artifact uploads; account project creation and client-key reads; declared vendor refresh reads. | [api/spec](./api/spec/SOURCE.md), Sentry's pinned OpenAPI document and evidenced patches |
10
10
 
11
- 1. **Ingestion (the SDK side)** — `POST /api/:projectId/store/` and `/api/:projectId/envelope/`,
12
- authenticated by the DSN public key (`X-Sentry-Auth` / `?sentry_key=` / envelope `dsn`). The
13
- twin derives a **deterministic fingerprint**, **groups** events into issues, increments
14
- `count` + `firstSeen`/`lastSeen`, persists the event, and returns the event id. A new event on
15
- a resolved/ignored issue **reopens** it (regression).
16
- 2. **Web API (the dashboard side, `/api/0/...`)** — issues (list with `query`/`sort`, retrieve,
17
- resolve/ignore/unresolve/assign, delete, events), events, projects + keys/DSN, releases +
18
- deploys + commits, organizations + teams, and alert rules + **signed webhooks**.
11
+ The application's SDK authenticates ingestion with its public DSN key. API calls use scoped personal tokens or
12
+ organization CI tokens, stored by their hash. The credential door is bootstrap signup: it creates the account,
13
+ first token, project and client key named by the environment, returning the same credentials at every boot.
14
+ Additional projects are created through `createOrganizationProject`; their DSNs are read through `listProjectKeys`.
19
15
 
20
- No real Sentry is ever contacted on the serve path — it's fully local and offline. Real vendor
21
- I/O happens **only in the connector**, over an **injected client** (a fake in tests, a real
22
- token-authed client in prod). `readOnly` rejects writes (vendor-shaped 405). An unmodeled
23
- operation **fails like Sentry** (4xx JSON `{ detail }`) — never a fabricated success.
16
+ World account doors:
24
17
 
25
- ## Quick start
18
+ - `POST /_twin/app-credentials`: bootstrap account, first token and env-named project/DSN.
19
+ - `POST /_twin/organizations {slug, name?}`: additional account signup.
20
+ - `POST /_twin/auth-tokens {organization, name, kind?, scopes?}`: organization CI or scoped personal token issuance.
26
21
 
27
- ```bash
28
- # serve the twin (ingestion + Web API); prints the DSN to point @sentry/node at
29
- bunx world-sentry serve --port 9000
30
- # point @sentry/node at DSN: http://twinpublickey...@127.0.0.1:9000/1
22
+ Vendor refresh lists organizations, projects, releases, monitors and check-ins to the end of their declared Link continuation. Events and issues are refreshed by their known subject ids, through the core's declared path mappings. Client keys stay under credential custody. Telemetry receipt is not deployed as an account change.
23
+ Sentry's API rate-limit page gives endpoint-specific response headers, without a numerical global allowance.
31
24
 
32
- # the dashboard mirror (React)
33
- bunx world-sentry mirror --port 9001
34
-
35
- # offline shape conformance
36
- bunx world-sentry conformance
37
- ```
38
-
39
- ```ts
40
- import * as Sentry from '@sentry/node';
41
- Sentry.init({ dsn: 'http://twinpublickey00000000000000000000@127.0.0.1:9000/1' });
42
- Sentry.captureException(new Error('boom')); // → a grouped issue in the twin
43
- ```
44
-
45
- ## Coverage
46
-
47
- The honest denominator is the **capability manifest** (`src/sentry-capabilities.ts`): the real
48
- Sentry surface, ranked core → common → niche, where every `done` capability is proven by an
49
- **offline** `verify()` that drives real ingest/create → read → assert against the twin. The
50
- baseline test (`src/sentry-capabilities.test.ts`) asserts via `assertManifestBaseline`: total
51
- ≥ 50, done > 0, **0 regressions**. Every capability is either `done` or `todo`.
52
-
53
- **Modeled (core → niche):**
54
-
55
- - **Ingestion** — store + envelope endpoints, DSN public-key auth (header/query/envelope),
56
- message + exception events, deterministic grouping (incl. number normalization), distinct
57
- grouping, regression reopen, culprit from the top in-app frame.
58
- - **Issues** — list (`query` DSL: `is:`, `level:`, free text; `sort=date|freq|new`), retrieve,
59
- resolve/ignore/unresolve/assign, delete, events + latest event, shortId/permalink/metadata,
60
- **bulk** resolve/ignore (`?query`/`?id`), **merge** groups, **tag value distributions**
61
- (`/tags/`, `/tags/:key/`), **grouping hashes** (`/hashes/`), **activity feed** (`/activity/`),
62
- **user feedback** (`/user-feedback/`: submit + list crash-report comments, linked to the event's issue).
63
- - **Events** — list, retrieve, tags/level/platform, exception stacktrace entries,
64
- **attachments listing** (envelope `attachment` items → per-event metadata), **org event facets**
65
- (`/events-facets/`: tag-value `topValues` distributions across the org's persisted events).
66
- - **Projects** — list/retrieve/create/update/delete, project **keys/DSN** (list + create +
67
- toggle/revoke/**delete** + **per-key rate-limit** config), **environments** (distinct envs),
68
- **ownership rules + CODEOWNERS** (path/url/module → owners, schema-parsed), **inbound data
69
- filters** (browser-extensions / legacy-browsers / localhost / web-crawlers toggles), **spike
70
- protection** (org-level enable/disable per project — `/spike-protections/`).
71
- - **Releases** — create/list/retrieve/update/delete, associate commits, **deploys**, **release
72
- files / artifact registry** (source-map upload metadata), **commit files** (`/commitfiles/`:
73
- files changed across a release's commits, flattened from each commit's patch set), **release
74
- health** (crash-free session tallies over real persisted session envelopes — `/organizations/:org/sessions/`).
75
- - **Organizations + teams** — list/retrieve/create/update/delete (org), list/create (teams),
76
- **org members** (invite / list / role change / remove), **team membership** add/remove,
77
- **SCIM 2.0 provisioning** (Users + Groups CRUD under `/scim/v2/` with faithful SCIM
78
- envelopes / ListResponse / 409-on-duplicate), **org stats** (`stats_v2` totals over real
79
- events), **integrations** (GitHub/Slack/PagerDuty install + config CRUD), **custom dashboards
80
- + widgets**, **Discover saved queries**.
81
- - **Alerts + webhooks** — issue alert rules with **actions** (email/Slack/PagerDuty/MS Teams,
82
- validated per-type), **metric alert rules** (`/alert-rules/`: aggregate + dataset + thresholds
83
- with critical/warning triggers), **signed** (HMAC-SHA256 `Sentry-Hook-Signature`) webhooks on
84
- **new-issue** + **regression** via an **injected deliverer** (offline `verify()`).
85
- - **Mirror UI** — Issues stream (grouped errors: count / last-seen / level / status), Issue
86
- detail (latest-event stacktrace + tags), **Dashboards** (custom widgets), **Discover** (query
87
- builder scaffold + saved queries), Releases, Projects, **Alerts** (issue alert rules),
88
- **Settings** (general / client keys-DSN / environments) — all backed by real twin state.
89
- - **Connector** — pull (issues/projects/releases) + push (issue triage: resolve/ignore/assign)
90
- over an injected executor, with confirm + idempotent re-push.
91
-
92
- **Planned (`todo`) — the deeper engines Sentry runs that this twin has not built yet:**
93
-
94
- - **Symbolication** (`sentry.events.symbolication`) — de-minify stacktrace frames against uploaded
95
- source maps and debug files. Raw frames and the artifact registry are already faithful.
96
- - **Span percentile aggregation** (`sentry.performance.span_aggregation`) — p50/p75/p95 computed
97
- over the transaction and span events the twin already stores, plus the trace and time-series read
98
- endpoints that serve it.
99
- - **Session Replay segment ingest** (`sentry.replay.segment_ingest`) — accept and persist the
100
- recorded rrweb/DOM segment uploads and serve the replay list, detail and segment reads.
101
- - **Continuous profiling** (`sentry.performance.profiling`) — accept sampled stack-profile envelopes
102
- and serve the flamegraph aggregation computed over them.
103
- - **Grouping enhancements** (`sentry.ingest.grouping_enhancements`) — stack-aware
104
- grouping-enhancement rules, fingerprint rules and frame heuristics on top of the deterministic
105
- base fingerprint (exception type + value + culprit, or message, numbers normalized), which is
106
- documented and already faithful-but-simple.
107
- - **Cron monitors** (`sentry.crons.monitors`) — check-in endpoints plus a deterministic
108
- heartbeat-miss detection engine over stored check-ins.
109
-
110
- Several config-modeled surfaces persist and round-trip their CONFIG faithfully while their live
111
- EXECUTION is likewise unbuilt: metric-alert threshold evaluation/firing, Discover arbitrary query
112
- execution (the builder and saved queries are real), and attachment binary download (the metadata
113
- listing is real; the bytes need a blob store). Alert-action config persists and round-trips, and no
114
- notification is sent. Release-health crash-free counts ARE real exact tallies over persisted
115
- sessions; only the time-series rollup is absent.
116
-
117
- ## Architecture
118
-
119
- State and execution follow the shared [model](../../../docs/concepts/the-model.md) and
120
- [architecture](../../../docs/contributing/architecture.md). The kernel owns storage and execution
121
- mechanics; this package owns vendor semantics. Conformance tooling is a development dependency.
122
- The [generated index](../../../generated/INDEX.md) records this package's protocol standing.
123
-
124
- ## Rate budget — the fail-closed backstop on live calls
125
-
126
- `liveSentryExecute` is the **one place** this pack issues a live request, so every call it makes is charged
127
- against a persistent, fail-closed spend ledger **before** the request goes out. Past the ceiling, or
128
- while a `Retry-After`/429 cooldown is armed, it **throws instead of calling**. The ledger is keyed by
129
- vendor and a hash of the credential (limits are per credential, so it is deliberately *not*
130
- cwd-scoped) and persists across processes, so a fresh process does not get a fresh allowance; a
131
- corrupt ledger counts as a **full** window rather than zero spend. There is no option to disable it,
132
- and no value you can pass for `budget` that yields an unguarded client — an injected budget is
133
- validated by *method identity*, so a subclass or a `Proxy` that replaces `checkBudget` is refused.
134
-
135
- The declared numbers: **60 weighted units / 60s at weight 2 = 30 calls/minute — exactly the kernel's austere fallback**, because Sentry publishes *no* figure at all (per-endpoint windows, unstated). What the guard buys for an unknowable limit is the **cooldown**: `X-Sentry-Rate-Limit-Remaining: 0` and `Retry-After` become a persisted client-side stop instead of a retry storm. Issue/event list reads cost 4 — the paginated firehose the docs tell you not to poll.
136
-
137
- The mechanism is **shared and vendor-agnostic** — it lives in the kernel (`@volter/world-core` →
138
- `packages/world-core/src/rateBudget.ts`); what lives here in [`src/sentry-budget.ts`](src/sentry-budget.ts) is this vendor's
139
- **declaration** (window, ceiling, per-endpoint weights, and a `reason` citing the limits above) plus
140
- the vendor-bound `SentryBudget`. The rule is ratified as
141
- [../../../docs/contributing/architecture.md](../../../docs/contributing/architecture.md) **D8**, and the kernel module's header documents what the
142
- guard does *not* guarantee — read that before trusting it.
25
+ Every other API operation is the declared gap. Source maps are retained and assembled, without server symbolication.
26
+ Grouping follows explicit fingerprints, stack frames, exception or message; Sentry's configurable grouping engine is
27
+ not reproduced. Repository integrations, release deploys, team membership and additional client-key creation are
28
+ outside the demanded calls. Cron outcomes come from received check-ins; scheduled missed/timeout outcomes are not
29
+ synthesized. [STANDING.md](../STANDING.md) owns the procedure's form.
@@ -0,0 +1,15 @@
1
+ # Sentry's API
2
+
3
+ - **Why this document:** Sentry's own OpenAPI document for its web API, as it publishes it for its API reference:
4
+ getsentry/sentry-api-schema at `98ec014705fbecf18c2650097e4630afe51ffd85` (2026-09-29), `openapi-derefed.json`,
5
+ vendored gzipped and unchanged (`openapi.json.gz`).
6
+ - **Servers:** `https://{region}.sentry.io` (us, de); sentry-cli and the applications call `https://sentry.io/api/0/`.
7
+ - **Corrections** (`patches.json`, each with its evidence): the chunk upload (`/chunk-upload/`) and artifact bundle assembly
8
+ (`/artifactbundle/assemble/`) that sentry-cli uploads source maps through; and a single project's release paths
9
+ sentry-cli uses; and its previous-release-with-commits lookup during local git fallback. Their evidence is getsentry/sentry at `2efdd4760a75a3d395e3534b7f66a7fbb0c3f22e` and
10
+ getsentry/sentry-cli 2.58.4 and 2.58.5 (the versions the applications lock).
11
+
12
+ - **Resource normalization:** the five refresh reads reference named copies of their unchanged inline response schemas. The patches cite each operation in the pinned upstream document; no wire field is added or removed.
13
+
14
+ - **Vendored document SHA-256** (openapi.json.gz, decompressed bytes where gzipped): `bb07d2bb747b10b31c14722066cd1d11bd0bb76eea8dcfb5f341b4c421c1c1f9`.
15
+ - **Read by:** Codex contributor.
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "title": "Event read requires the project scope",
4
+ "operation": "getProjectEvent",
5
+ "source": "https://raw.githubusercontent.com/getsentry/sentry-api-schema/98ec014705fbecf18c2650097e4630afe51ffd85/openapi-derefed.json",
6
+ "means": "getProjectEvent",
7
+ "status": 403,
8
+ "output": {
9
+ "detail": "You do not have permission to perform this action."
10
+ }
11
+ }
12
+ ]
Binary file