> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ionworks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026 09 21

<Update label="September 21, 2026" description="Invite collaborators straight into a project, and shorter links to everything in the app">
  ## Invite a collaborator straight into a project

  Bring someone into a project with **just their email address** — a partner at a
  supplier, a consultant, a colleague who has never signed in here. They do not
  need to be in your organization first, and they do not need an account at all.

  One step does the whole thing: an unregistered address is sent a sign-up
  invitation, anyone outside your organization is added to it at the
  least-privileged level, and they land in the project with exactly the role you
  picked. Someone already in your organization keeps the role they hold, so
  inviting a fellow Admin into a project can never change their standing
  elsewhere. Inviting by email grants organization membership, so it sits with
  organization Admins; Project Admins continue to add existing members to their
  own projects.

  ## The app now lives at the site root

  Links to everything in the app are shorter. A project is `/projects/<id>`,
  your account is `/account`, organization settings is `/organization-settings` —
  the `/dashboard` segment is gone from every page. It said nothing (everything
  you see while signed in sat under it) and it was carried by every link you
  paste into a message, every documentation URL, and every link the Python SDK
  mints.

  **Everything you have already shared keeps working.** Any `/dashboard` link
  redirects to the same page at its new address, query string and anchor intact —
  bookmarks, links in notification emails sent months ago, and links produced by
  older SDK builds all land where they should.

  <AccordionGroup>
    <Accordion title="Studio">
      **Improvements**

      * **The material detail page shows who created it.** Creation has been recorded
        all along; there was no name to display until now. Materials created before the
        field existed simply omit the row rather than showing a blank.
      * **Rate-ladder specific capacity is exported.** Discharge and charge specific
        capacity now flow out alongside their absolute counterparts for the
        rate-capability sections. A cell whose active mass is unknown emits the
        absolute figures as before.
      * **Analysis plots open on something worth looking at.** A plot used to default to
        the first two numeric columns, which on a section table meant drawing the row's
        own index against a second way of counting the same rows. Axes are now chosen by
        what the columns mean — a cycling analysis opens on capacity against cycle, a
        pulse section on internal resistance against cycle. Both dropdowns still offer
        every numeric column.
      * **Faster pipeline pages, and bulk actions that no longer move megabytes.**
        Reading a pipeline's elements, and cancelling or resubmitting them in bulk, were
        each carrying the full configuration and results of every row they touched, none
        of which was read. Cancelling a large selection is the most noticeable.

      **Fixes**

      * **Formation cycles are grouped by their opening charge.** A formation is the
        one case where a cell arrives empty, so its cycle is led by the charge rather
        than the discharge. Grouping the other way left out the opening charge — the
        large, irreversible one that formation exists to measure — which distorted
        first-cycle coulombic efficiency.
      * **A constant-voltage hold counts toward its cycle.** The taper that finishes a
        CC-CV charge starts and ends at the ceiling, so it was not joined to the cycle
        and charge capacity covered only the constant-current leg. On a C/20 taper
        that is roughly 9% of the charge. The hold, and the rest that follows it, now
        belong to their cycle.
      * **Rate ladders keep their fastest rungs.** A ladder made of charges was judged
        by where the cell had relaxed to during the preceding rest rather than where
        the load began, so faster rungs were the ones dropped. A seven-rung ladder now
        reports seven, and the capacity retention computed against them follows.

        Existing analyses do not recompute on their own; new and re-run records carry
        the corrected numbers.
      * **A pipeline can build on an earlier fit.** An entry naming where its starting
        parameters come from — a completed pipeline, or a JSON file — now submits.
        The reference is resolved to real values as you submit, against your own
        permissions, so an unreachable one is an immediate, explanatory error on the
        request.
      * **The right-hand y-axis on a measurement plot can be cleared again.** Once a
        series was chosen there was no way back to an empty right axis — the "None"
        option disappeared and the last series could not be removed. Every right-axis
        series now has a remove control, labelled "Clear right axis" when it is the last
        one.
      * **Single-point plots render.** A trace with exactly one point was drawn as a
        zero-length line, which is invisible; it now shows as a marker, with the axes
        framed proportionally around it.
      * **The account page no longer claims you belong to no organizations** while it is
        still loading them, or if the request fails. That message now appears only when
        it is actually true.
      * **The project members panel no longer hangs on "Loading members…"** when there
        is no organization context; it says so instead.
      * **An experiment with no description falls back to its protocol name** rather
        than the literal text "Description not available".
      * **A Project Viewer no longer sees an empty, unlabelled actions column** on the
        parameterized-model lists. The menu items were already hidden; the column itself
        is now omitted when none of its actions are available.
      * **Stored degradation-model parameters are cleaned more thoroughly**, including
        ones a model only reveals while it is being built, and the result is verified
        against a fresh model before it is saved.
    </Accordion>

    <Accordion title="Python API">
      **Improvements**

      * **A value that cannot be sent to the server now fails where you wrote it**,
        naming the field. A live model object, a callback, or a logger placed in a
        configuration field used to survive locally, arrive as its text representation,
        and fail server-side far from the cause. Parameter mappings are unaffected —
        functions and array data in a parameter set are converted as they always were.
    </Accordion>
  </AccordionGroup>
</Update>
