diff --git a/docs/DC/Web/Features/.pages b/docs/DC/Web/Features/.pages index 18df361..35af214 100644 --- a/docs/DC/Web/Features/.pages +++ b/docs/DC/Web/Features/.pages @@ -1,3 +1,4 @@ title: Features arrange: - index.md + - snapshot.md diff --git a/docs/DC/Web/Features/index.md b/docs/DC/Web/Features/index.md index d2e062f..eae1502 100644 --- a/docs/DC/Web/Features/index.md +++ b/docs/DC/Web/Features/index.md @@ -11,6 +11,7 @@ DeepCube Web provides browser-based access to your application telemetry at [por | **[Dashboard](#dashboard)** | Health scores, throughput, latency percentiles (P50/P95/P99), and error rates at a glance | | **[Trace Analysis](#trace-analysis)** | Waterfall, flame graph, and network graph views with detailed span inspection | | **[Log Search](#log-search)** | Full-text log search with structured filtering | +| **[Snapshot](snapshot.md)** | Which services sent traces at the end of the selected time range, beside the summary charts | ## AI Assistant diff --git a/docs/DC/Web/Features/snapshot.md b/docs/DC/Web/Features/snapshot.md new file mode 100644 index 0000000..ba70b49 --- /dev/null +++ b/docs/DC/Web/Features/snapshot.md @@ -0,0 +1,227 @@ +--- +description: "See which services sent traces at the end of your selected time range in DeepCube™ Web, beside the Apdex, request rate, error rate and p90 charts for that range." +--- + +# Snapshot + + +In DeepCube Web, a **snapshot** shows how your grid was doing over the range selected in the time range picker, and which services sent traces in the 5 minutes before the end of that range. It answers the question a trace or a log line raises: what else was going on at that time? + +A snapshot shows you two things: + +- **Four charts for the selected range:** Apdex, request rate, error rate and p90. They are the same charts shown above the **Traces** and **Logs** lists. +- **What was running:** the services that sent traces in the 5 minutes before the snapshot time. + +!!! note "What the list shows and what it does not" + The **What was running** list gives service names only. It does not show instances, a last-seen time or a service state, and it does not give figures for each service. For figures, use the four charts. + + When the list cannot be measured for a time, the snapshot shows the reason in place of the list, not an empty list. When the list was measured and no service sent traces, it says "No service sent telemetry at this time." See [When the list cannot be given](#when-the-list-cannot-be-given). + +## What Snapshot is for + +Use Snapshot when a trace, a log line or a chart makes you ask what else was happening at that time. It helps you: + +- **Put a span or log line in context.** From a trace or a log line, **Around this span** or **Around this log** lists the services that sent traces in the 5 minutes before it, with the span's or log's own service first. +- **See the grid's overall shape for a time window.** The four charts (Apdex, request rate, error rate and p90) cover the whole range you picked. +- **Compare two periods.** Change the range in the time range picker and the page follows, so you can look at a quiet period and a busy one with the same view. +- **Share what you are looking at.** A fixed range in the address holds the same start and end for whoever opens it. See [Sharing a snapshot](#sharing-a-snapshot). + +Snapshot reports what the grid received. It does not report the health, state or cause of any single service. Use the **Traces** and **Logs** lists for the detail behind a figure. + +## Open a snapshot + +There are three ways in. + +### From the menu + +Select **Snapshot** in the grid's navigation menu, directly under **Logs**. The page uses whatever range is selected in the time range picker, so you do not need to enter a time. + +### From a span or a log + +1. Open a trace from **Traces**, or a log line from **Logs**. +2. In the **Trace** tabs, select **Around this span** (from a trace) or **Around this log** (from a log line). + +The tab shows the grid at the time the span or log line was recorded, with that span's or log's own service first. See [The Around this span and Around this log tabs](#the-around-this-span-and-around-this-log-tabs). + +### See the whole grid at this time + +At the top of the **Around this span** and **Around this log** tabs, select **See the whole grid at this time**. It closes the details panel and opens the **Snapshot** page with the time range picker set to the 15 minutes ending at the span's or log's time. + +If the span or log line has no usable time, the link is not shown. + +## What the Snapshot page shows + +From top to bottom: + +1. The **Snapshot** heading, and the line: "How the grid was doing over the range selected above, and which services were running at its end." +2. The four charts, for the whole selected range: + + | Chart | Shows | + |-------|-------| + | **Apdex** (T=500) | Apdex over the range | + | **Request Rate** | Overall request rate | + | **Error Rate** | Overall error rate | + | **p90** | p90 (90th percentile) over the range | + +3. **What was running**, taken at the end of the range. + +### What was running + +A sentence above the list states the period it covers. Usually it reads: + +> Services that sent telemetry in the last 5 minutes of the selected range. + +Below it, the list names each service that sent traces in those 5 minutes, sorted by service name. The list has one column, **Service**. + +Read the list exactly for what it says: + +- A listed service sent traces with at least one span (one step of a trace) that started in those 5 minutes. The list goes by when each span started, not by when it reached the grid. +- A service that is not listed sent no traces the grid could attribute to it in those 5 minutes. The list does not say why, and it does not say whether the service was up or down. +- The list is built from traces only. A service that sent only logs in those 5 minutes is not listed. + +If the list was measured and no service sent traces, you see: + +> No service sent telemetry at this time. + +### Reading the list in practice + +| You see | What it tells you | What it does not tell you | +|---------|-------------------|---------------------------| +| A service in the list | It sent traces in the 5 minutes covered | How many, how healthy, or which instance | +| A service you expected is not in the list | The grid has no traces it could attribute to that service in the 5 minutes covered | Why. The list does not say. A service that sent only logs, or no traces in those 5 minutes, is not listed | +| The message "No service sent telemetry at this time." | The list was measured and no service sent traces in those 5 minutes | That anything was down | +| "We cannot say what was running yet" | The list could not be measured for this time | Anything about any service | + +To check an earlier period, choose a custom range that ends 5 minutes earlier and compare the two lists. Make it any length other than exactly 15, 30 or 45 minutes: the picker treats a range of exactly those lengths as **Last 15**, **30** or **45 minutes**, which ends now. Each list covers the 5 minutes before the end of its range, so the two lists do not overlap. + +## How the snapshot follows the time range picker + +The time range picker is the only time control on the **Snapshot** page. The page has no time control of its own. + +- **The snapshot time is the end of the selected range.** The charts cover the whole range. **What was running** is taken at its end. +- **Change the range, and the page follows.** Pick a new range in the picker and the charts and the list update to match. +- **A link that names a time sets the picker.** **See the whole grid at this time** sets the picker to the 15 minutes ending at that time, so the picker always shows the range the page is using. + +The **Snapshot** page does not show the time as a row of its own. Read it from the time range picker, or, when the list is taken at an earlier time, from the sentence above the list. The **Around this span** and **Around this log** tabs show the time themselves. + +### When the end of the range is too recent + +Data for a time keeps arriving for a few minutes afterwards. In this build, a time is treated as **complete** once it is at least 5 minutes in the past. This is an assumed delay, not a measurement of when the data has actually arrived, so very late data can still change the list after that. Before a time is treated as complete, the list for it could still change. + +When you have just chosen a range such as **Last 15 minutes**, its end is the current time, so it is not treated as complete yet. Ranges such as **Today** or **This Month** end in the future. In these cases the page does not leave the list empty. It takes the list at the **newest complete time** instead, which is about 5 minutes before you opened the page or changed the range, and the sentence above the list names that time: + +> Services that sent telemetry in the 5 minutes up to *time*. + +The time range picker does not move, and the charts still cover the whole selected range. + +The page works out the newest complete time from your computer's clock and asks for it once. If the server does not treat that time as complete either, which can happen when your computer's clock is ahead of the server's, the list is not shown and you see: + +> **This time is too recent** +> +> Data for this time is still arriving, so what is shown here can still change. Do not use it for an alert or an SLO decision yet. + +**What you can do:** choose a range that ends further in the past. If the alert keeps showing, check that your computer's clock is set correctly. + +## The Around this span and Around this log tabs + +These tabs show the snapshot for one span or one log line, with its own service first. The tab loads only when you select it. + +At the top of the tab you see: + +- The heading **Around this span** or **Around this log**. +- The line "What *service* and the rest of the grid were doing when this span was recorded." (or "this log was recorded"). +- **Time:** the time the snapshot describes, to the second, in your own time zone with the zone named, for example `13 Oct 2026, 14:05:00 GMT+2`. Hover over it to see the same time in UTC. + +Below that, a heading with the service's name and the sentence: + +> Services that sent telemetry in the 5 minutes before this span. + +The list shows every service that sent traces in those 5 minutes. The span's or log's own service comes first, tagged **this span** or **this log**. The rest follow, sorted by service name. + +If the span's or log's own service sent no traces in those 5 minutes, the tab says so above the list: + +> *service* sent no telemetry in the 5 minutes up to this span. + +The tab has no time control. To see the whole grid at that time, with the charts, select **See the whole grid at this time**. + +If the span or log line is so recent that its time is not treated as complete yet, the tab shows the newest complete time instead, and **Time** shows which time that is. In that case the sentences in the tab describe the time shown in **Time**, not the span or log line itself. + +## Sharing a snapshot + +The page address holds the selected time range, so copying the address shares the snapshot. What the other person sees depends on how the range was chosen: + +| How you chose the range | What the address holds | What the other person sees | +|-------------------------|------------------------|----------------------------| +| **Last 15 minutes**, **Last 30 minutes** or **Last 45 minutes** | A length only | The last 15, 30 or 45 minutes at the time **they** open the link, not the time you were looking at | +| Any other range in the picker, such as **Today**, **Yesterday** or a custom range (unless it is exactly 15, 30 or 45 minutes long, which the picker treats as **Last 15**, **30** or **45 minutes**) | A fixed start and end | The same range you selected | +| **See the whole grid at this time** | A fixed start and end | The same 15-minute range ending at the span's or log's time | + +To share a fixed time, use **See the whole grid at this time**, or a custom range that is not exactly 15, 30 or 45 minutes long, then copy the address. + +Even with a fixed range, the other person can see something different from you when: + +- **The end of the range was too recent when you looked.** You saw the list at the newest complete time. If they open the link later, the end of the range may be treated as complete by then, and they see the list at the end of the range itself. Check the sentence above the list: it names the period the list covers. +- **The time has passed the grid's retention.** They see that the data has been removed. See [When the list cannot be given](#when-the-list-cannot-be-given). +- **They do not have access to the grid.** They see "This time could not be loaded". See [Limits](#limits). + +The **Around this span** and **Around this log** tabs have no address of their own. To share what a tab shows, select **See the whole grid at this time** and copy the address of the page it opens. + +## When the list cannot be given + +Sometimes the snapshot cannot say what was running. It then shows this in place of the list: + +> **We cannot say what was running yet:** *reason* +> +> A service missing from here means we have no information about it, not that it was down. + +The reasons you can see in this build: + +| Reason shown | When it appears | What you can do | +|--------------|-----------------|-----------------| +| The data for this time has been removed under the 30-day retention. | The time is older than the data the grid still keeps. It comes with the **Data has been removed** alert (below). The period in this wording is fixed text. Your grid's trace retention setting decides. | Snapshot will not show this time. The **Traces** and **Logs** lists may still hold it, depending on your grid's retention. | +| There is too much data here to measure exactly. | More than 50,000 spans started in the 5 minutes before the snapshot time, so the list was not measured rather than measured from part of the data. | Choose a range that ends at a different time. The list is measured over the 5 minutes before the end of the range, so a quieter 5 minutes can be measured. Use the **Traces** list to look at the busy period itself. | + +For a time that is too recent, the snapshot shows the **This time is too recent** alert instead of a reason. See [When the end of the range is too recent](#when-the-end-of-the-range-is-too-recent). + +### Data has been removed + +For a time past the grid's retention, an alert appears above the list: + +> **Data has been removed** +> +> This time is past the 30-day data retention. Its data is gone and cannot be recovered. + +The Snapshot page shows this message as fixed text. **The period in it is not read from your grid.** What decides whether a time counts as removed is your grid's trace retention setting, so trust that setting over the number in the message. If your grid has no trace retention set, the snapshot assumes a short history, so older times can show as removed much sooner than the number in the message suggests. + +A time counts as removed once it is older than that retention, less 20 minutes. The 20 minutes are a 15-minute window that the removal check looks back over from the time, plus a 5-minute safety margin, so a snapshot stops showing data slightly before that data is deleted. The list itself still covers only the 5 minutes before the time. + +## Limits + +- **Time control.** The time range picker is the only time control. See [How the snapshot follows the time range picker](#how-the-snapshot-follows-the-time-range-picker). +- **Presence period.** **What was running** always covers 5 minutes and is built from traces only. See [What was running](#what-was-running). +- **Busy periods.** See [When the list cannot be given](#when-the-list-cannot-be-given). +- **Recent times.** See [When the end of the range is too recent](#when-the-end-of-the-range-is-too-recent). +- **Retention.** See [Data has been removed](#data-has-been-removed). +- **Access.** You need access to the grid. Without it, the snapshot does not load and you see "This time could not be loaded". +- **Request rate.** Snapshot requests are rate limited per caller, under the same limit as trace and log queries. If you reach the limit, you see "This time could not be loaded", and an error notification may also appear at the bottom of the screen. Wait, then select **Try again**. + +## Messages you may see + +| Message | What it means | What you can do | +|---------|---------------|-----------------| +| **This time could not be loaded** "The request failed, so nothing can be shown for this time. That does not mean nothing was running. Try again, or move to another time." | The request for this time failed. This includes not having access to the grid and reaching the request limit. It is not an answer about the grid. | Select **Try again**. If it keeps failing, check that you have access to the grid. | +| **No time to show** "This needs a point in time, and none was given, so nothing was looked up." | Whatever is open did not supply a time, so nothing was requested. This is not an empty grid. | On the **Snapshot** page, choose a range in the time range picker. | +| Nothing came back for this time. | The request finished without returning a snapshot. | Choose the range again, or try a different one. | +| **This time is too recent** | Even the newest complete time is not treated as complete by the server. | See [When the end of the range is too recent](#when-the-end-of-the-range-is-too-recent). | +| **Data has been removed** | The time is past the grid's retention. | See [Data has been removed](#data-has-been-removed). | +| **We cannot say what was running yet:** *reason* | The list could not be measured for this time. | See [When the list cannot be given](#when-the-list-cannot-be-given). | +| No service sent telemetry at this time. | The list was measured, and no service sent traces in those 5 minutes. | Check that traces from your services reach this grid, for example in the **Traces** list for the same range. | +| *service* sent no telemetry in the 5 minutes up to this span. (or "this log") | In a tab: the span's or log's own service sent no traces the grid could attribute to it in the 5 minutes before the span or log. The window stops just before the span's own start, so a service whose only trace is that one can appear here as silent. The rest of the list is still shown. | Read the rest of the list as usual. For the charts at that time, select **See the whole grid at this time**. | + +## Related + +| Topic | Link | +|-------|------| +| Everything in DeepCube Web | [Features](index.md) | +| Using DeepCube Web | [Guides](../Guides/index.md) | +| Version history | [Release Notes](../release-notes.md) | diff --git a/docs/DC/Web/release-notes.md b/docs/DC/Web/release-notes.md index 79eb1bb..3fd33c8 100644 --- a/docs/DC/Web/release-notes.md +++ b/docs/DC/Web/release-notes.md @@ -6,6 +6,88 @@ description: Version history for DeepCube™ Web, newest first. ## Version History +### 3.189.0 October 13, 2026 { id="3.189.0" } + +**Introduction:** + +This release rolls up everything since 3.183.0, and the theme is seeing the rest of the grid at the moment something happened. A new Snapshot page, and a tab on every trace and log, show which services sent traces at that time, and when that cannot be known they say why instead of showing an empty list. In the API, the grid graph now keeps one node per service through restarts, which changes the shape of its nodes. The node count for a billing cycle is now rounded down. + +**New Features:** + +- **Snapshot**: A new **Snapshot** page, under Traces and Logs in the menu, shows how a grid was doing over the range selected in the time range picker. It has the same Apdex, request rate, error rate and p90 charts as the trace and log lists, and lists the services that sent traces in the last 5 minutes of the range. It replaces the Moment page and the Grid Summary tab of earlier builds. +- **Around This Span and Around This Log**: Trace and log details have a new tab listing every service that sent traces in the 5 minutes before the span or log line, with that span's or line's own service first and marked. **See the whole grid at this time** opens the Snapshot page on the 15 minutes ending there. +- **A Snapshot Says What It Cannot See**: If the data for a time is still arriving, the snapshot shows the newest time whose data is complete, and warns that the time is too recent only if even that is incomplete. If the services at a time cannot be determined, the snapshot gives the reason instead of an empty list, and says that a missing service means there is no information about it, not that it was down. A time whose data has aged out says the data has been removed. If loading fails, the snapshot says so and offers **Try again**. +- **Moment API**: `GET /apm/grids/{gridSecondaryId}/moment?at=` lists the services that sent traces (spans) in the 5 minutes up to the requested time, or names the reason in `state.withheld` when that could not be measured. `at` is required (a time with no offset is read as UTC), and `window` is an ISO 8601 duration (default `PT15M`, at most `PT1H`) that sets the period for the graph and figures, not the 5-minute services list; a missing `at`, an invalid `window` or an `include` other than `graph` returns `400`, and a grid you have no role on returns `404`. `include=graph` adds the grid graph for the moment's own window, in the same shape as `GET /apm/grids/{gridSecondaryId}/graph`, or `null` when the data cannot support one. `evidence.expiresAt` states when the moment's data is no longer available. The readings that change on every request are returned in the `X-Moment-Watermark` and `X-Moment-Retention-Floor` headers, not the body. Like trace and log queries, the moment and graph endpoints are rate limited and answer `429` when the limit is reached. + +**Improvements:** + +- **Grid Graph: One Node per Service (Breaking Change)**: In `GET /apm/grids/{gridSecondaryId}/graph`, each service node is now a whole service, with the instances that sent spans in the window listed in `instances` for display, so a restart or a rolling deploy keeps the same node instead of replacing it. Separate per-instance nodes are no longer returned, `identity.instance` is always `null`, `metrics.scope` is always `own`, and the `anchorId` and `level` fields are removed. Clients that keyed on instance nodes or read any of these fields need updating. +- **Refused Requests Count as Errors in the Graph**: A request refused with `429` now counts toward a node's error rate in the grid graph. It used to count as a success, so a service refusing most of its traffic could look healthy. Dashboards or alerts built on a node's `errorRate` may show higher values from this release. +- **Log Details Match Trace Details**: Opening a log now shows the log line itself above its trace, and the log view has the same Span View, Network Graph, Log Summary, Error Summary and Events tabs as the trace view. The Events tab used to show a "next release" placeholder. +- **The Detail Panel Leaves the List in View**: The panel that opens from a trace or log now takes about half the window instead of nearly all of it, so the list you opened it from stays beside it. On windows 1280 pixels wide or narrower it still takes most of the screen. +- **Plainer Alert Summary**: The diagnostics alert summary no longer reports "active alerts". It now says whether any service exceeded its thresholds in the window checked, and states that nothing is monitoring between checks. +- **Fewer Third-Party Scripts**: DeepCube Web no longer loads Google Analytics. The affiliate tracking script now loads only for visitors who arrived through an affiliate referral link, or who return carrying its tracking cookie, and pages now send only their origin to other sites as the referrer. + +**Bug Fixes:** + +- Security fixes to grid access and data isolation. +- Fixed the node count for a billing cycle being rounded to the nearest whole node. The cycle average is now rounded down instead, so an average of 6.67 nodes is billed as 6, not 7. +- Fixed editing a subscription resetting its metered node count to 1 until the next nightly usage update. An edit now leaves the items already on the subscription untouched. +- Fixed `GET /apm/grids/{gridSecondaryId}/moment` failing with `500` on every request in earlier builds. +- Fixed entering an instance returning a `routingKeyPrefix` that nothing ever published to, so a client that subscribed with it received nothing. The field is now null. +- Fixed the plan label beside the energy bar, such as "Personal subscription", running under the notification bell in the header. + +**Known Issues:** + +- The Moment API's figure tiles are not populated yet: every tile names a reason instead of a value. On a very busy grid, with more than 50,000 spans in the 5 minutes, the services list is also withheld, with the reason given. +- Time travel, replaying a grid over a period, remains unavailable. Snapshot shows the services at a single time. +- In some cases a new subscription is created without the plan details its grids need, and creating a grid on it is refused until the subscription is corrected. +- When creating a personal access token is refused, the API returns `403` with no machine-readable reason, or `404` for a grid or hub you cannot see. Do not retry a `403` automatically. + +### 3.183.0 October 1, 2026 { id="3.183.0" } + +**Introduction:** + +This release rolls up everything since 3.177.5, and the theme is being charged for what you actually did. Tessa now counts your conversation with her against your energy, not the fixed instructions sent ahead of every turn, so a visitor to a public grid is no longer stopped after one message. An invitation now grants nothing until it is accepted. Several billing fixes make each subscription pay for its own usage, and the API returns real HTTP status codes in place of server errors. + +**New Features:** + +- **Grid Graph Endpoint**: `GET /apm/grids/{gridSecondaryId}/graph` returns a grid's services and the connections between them as a single graph. If you lack a role on the grid, this route answers `404`, the same as for a grid that does not exist, so it never reveals which grid IDs are real. +- **Token Exchange Endpoint**: `POST /oauth2/token` follows the standard OAuth token exchange (RFC 8693): send a form-encoded body, and the `subject_token` must be the same credential you present on the request, or the call fails with `invalid_grant`. It swaps your credential for a one-hour credential that records an actor acting on your behalf, designed to identify Tessa when she acts for you. A credential issued this way cannot create a personal access token. + +**Improvements:** + +- **Tessa Charges for Your Message, Not the Setup**: Every Tessa request carries a large, fixed block of instructions, and of tool definitions when tools are in use, ahead of what you type. It used to be charged to you whenever the provider's short-lived cache had expired, so the same message could cost many times more on a quiet day than on a busy one. That reusable block is now credited back, so you are charged for the conversation itself: your messages, what you attach and Tessa's replies. +- **Usage Limits Agree with the Energy Bar**: Limits now count usage against whoever actually paid for it, the grid you are visiting or your own subscription, so the check that refuses a request counts usage the way the energy bar does. +- **Refusals Say Whose Allowance Ran Out**: When a request is refused, the message now names the budget that is used up: the grid's visitor allowance, or your own subscription for the current period. +- **Chat Without Tools Is Now Counted**: Tessa requests that use no tools used to record no usage. They now count toward your energy like any other request. +- **Grid Nodes Billed over the Days a Grid Reported**: A grid's node count is now averaged over the days it sent telemetry, rather than over every day of the billing cycle. A day with no telemetry, for example while an API key has expired, no longer pulls your bill down for the rest of the cycle. A grid that is switched off for part of the cycle now bills its average size while it was running, which is more than before. Averages are rounded to the nearest whole node. +- **Invitations Must Be Accepted**: Every invitation that is created is now pending and sends its link, even when the address already has an account. Access starts only when the invitee signs in and accepts, and an invitation for access the person already has is refused. The "permission granted" email that used to go out before anyone had accepted is no longer sent. +- **Clearer API Errors**: Requests that used to fail with `500` now return a status you can act on. A malformed or all-zero grid, environment or instance ID returns `404`. Chat and speech return `404` for an unknown user or a caller who is not an active participant, `429` when energy is exhausted (with a `Retry-After` header when the recharge time is known), and `503` when speech is not configured. Entering an instance while a model is briefly unavailable returns `503`. Errors use the standard RFC 9457 problem details format, except on `POST /oauth2/token`, which answers with standard OAuth error codes. +- **API Limits**: Trace and log queries now reject a range wider than 31 days, which still covers the Last 30 Days, This Month and Last Month presets, and reject a range whose start is after its end, both with `400`. Rate limits now apply to trace and log queries, diagnostics, chat, speech, energy detail, products and subscription changes, and to some endpoints that need no sign-in, which are limited per IP address. A rate-limited request returns `429`, the same status as exhausted energy; only the energy case carries `Retry-After`. +- **Secrets Are Never Cached**: The responses that carry a password, key or token now always carry `Cache-Control: no-store`, so browsers and proxies do not store them. +- **Images Without a Caption**: A chat request that sends client tools, including the streaming chat request, can now include an image with no text prompt, so you no longer need a placeholder caption. Clients generated from an earlier version of the API still require a prompt until they are regenerated. + +**Bug Fixes:** + +- Security fixes to grid access and data isolation. +- Fixed certain Tessa messages tying up the server for several seconds. +- Fixed a security advisory in a third-party dependency (CVE-2026-26127, denial of service). +- Fixed Tessa refusing messages after only a few turns while your budget was still unspent, because the check made before each message counted the fixed instructions that billing credits back. +- Fixed Tessa refusing every message for the rest of the day once a daily total was passed, even when the current period still had budget and the energy bar showed it. +- Fixed your personal Tessa use (home space and private grids) being charged to a public grid's visitor allowance. +- Fixed subscriptions that share one billing profile being billed the same usage figure, so a seat or node count from one subscription could be applied to the other. Each subscription is now billed its own usage. +- Fixed editing a subscription failing with "Grid quality tier was not resolved for this subscription". +- Fixed a subscription edit sent through the API without `addOns` silently adding default add-ons. Leaving `addOns` out now means no add-on change. +- Fixed inviting an email address that is shared by two accounts failing outright. +- Fixed an invitee with an email address longer than 64 characters failing their first sign-in after being invited. + +**Known Issues:** + +- Time travel remains unavailable while replay is being reworked. +- In some cases a new subscription is created without the plan details its grids need, and creating a grid on it is refused until the subscription is corrected. +- When creating a personal access token is refused, the API returns `403` with no machine-readable reason, or `404` for a grid or hub you cannot see. Do not retry a `403` automatically. + ### 3.177.5 August 30, 2026 { id="3.177.5" } **Introduction:**