<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Fusion API: Milestone.name is documented as read/write but setter is ignored for existing milestones in Fusion API and Scripts Forum</title>
    <link>https://forums.autodesk.com/t5/fusion-api-and-scripts-forum/fusion-api-milestone-name-is-documented-as-read-write-but-setter/m-p/14137590#M22806</link>
    <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/9462569"&gt;@ppoloczek&lt;/a&gt;&amp;nbsp;-san.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;I tried it, and the milestone name was updated.&lt;/P&gt;
&lt;P&gt;Windows11 Fusion 360 Ver. 2702.1.58&lt;/P&gt;</description>
    <pubDate>Thu, 21 May 2026 14:21:37 GMT</pubDate>
    <dc:creator>kandennti</dc:creator>
    <dc:date>2026-05-21T14:21:37Z</dc:date>
    <item>
      <title>Fusion API: Milestone.name is documented as read/write but setter is ignored for existing milestones</title>
      <link>https://forums.autodesk.com/t5/fusion-api-and-scripts-forum/fusion-api-milestone-name-is-documented-as-read-write-but-setter/m-p/14137112#M22802</link>
      <description>&lt;P class=""&gt;&lt;SPAN&gt;Hi Autodesk Fusion API team,&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;I think there may be a bug or documentation mismatch in the Fusion Python API for &lt;/SPAN&gt;&lt;SPAN&gt;adsk.core.Milestone.name&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;According to the API documentation, &lt;/SPAN&gt;&lt;SPAN&gt;Milestone.name&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P class=""&gt;&lt;SPAN&gt;Gets and sets the name of the milestone.&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P class=""&gt;&lt;SPAN&gt;It is documented as a read/write string property.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;However, when I try to change the name of an existing milestone returned from &lt;/SPAN&gt;&lt;SPAN&gt;dataFile.milestones&lt;/SPAN&gt;&lt;SPAN&gt;, the assignment completes without exception, but the value does not change. Reading &lt;/SPAN&gt;&lt;SPAN&gt;milestone.name&lt;/SPAN&gt;&lt;SPAN&gt; immediately after assignment still returns the old value.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Environment&lt;/SPAN&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;SPAN&gt;Product: Autodesk Fusion&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;API: Fusion Python API&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;OS: Windows&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;File type: Cloud Fusion design with existing milestones&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;File is saved: Yes&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;Existing milestones: Yes&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;SPAN&gt;Expected behavior&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;This code should change the milestone name:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;target_milestone.name = "-"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P class=""&gt;&lt;SPAN&gt;or, if existing milestone names cannot be changed, the API should raise an exception or the documentation should say that existing milestone names are read-only.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Actual behavior&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;The assignment completes without exception, but the name remains unchanged.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;Example result:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;Target version: 15

Before assignment:
milestone.name = 'D'

Tried:
milestone.name = '-'

Immediately after assignment:
milestone.name = 'D'

Assignment completed without exception.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;Minimal reproduction script&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;import adsk.core
import adsk.fusion
import traceback


app = adsk.core.Application.get()
ui = app.userInterface


TARGET_VERSION_NUMBER = 15
NEW_MILESTONE_NAME = "-"


def get_sorted_milestones(data_file):
    result = []

    milestones = data_file.milestones

    for i in range(milestones.count):
        milestone = milestones.item(i)

        try:
            version_number = milestone.version.versionNumber
        except Exception:
            version_number = 0

        result.append((version_number, milestone))

    result.sort(key=lambda x: x&lt;SPAN class=""&gt;[0]&lt;/SPAN&gt;)
    return [x&lt;SPAN class=""&gt;[1]&lt;/SPAN&gt; for x in result]


def find_milestone_by_version(data_file, target_version_number):
    for milestone in get_sorted_milestones(data_file):
        try:
            if milestone.version.versionNumber == target_version_number:
                return milestone
        except Exception:
            pass

    return None


def list_milestones(data_file):
    lines = []

    for milestone in get_sorted_milestones(data_file):
        try:
            version_number = milestone.version.versionNumber
        except Exception:
            version_number = "?"

        try:
            name = milestone.name
        except Exception:
            name = "&amp;lt;error reading name&amp;gt;"

        try:
            description = milestone.version.description
        except Exception:
            description = "&amp;lt;error reading description&amp;gt;"

        try:
            is_valid = milestone.isValid
        except Exception:
            is_valid = "?"

        lines.append(
            f"Version {version_number}: "
            f"name='{name}', "
            f"description='{description}', "
            f"isValid={is_valid}"
        )

    return "\n".join(lines)


def run(_context):
    try:
        document = app.activeDocument

        if not document:
            ui.messageBox("No active document.")
            return

        design = adsk.fusion.Design.cast(app.activeProduct)

        if not design:
            ui.messageBox("Active product is not a Fusion design.")
            return

        document = design.parentDocument
        data_file = document.dataFile

        before_text = list_milestones(data_file)

        target_milestone = find_milestone_by_version(
            data_file,
            TARGET_VERSION_NUMBER
        )

        if not target_milestone:
            ui.messageBox(
                f"Could not find milestone for version {TARGET_VERSION_NUMBER}.\n\n"
                f"Existing milestones:\n\n{before_text}"
            )
            return

        old_name = target_milestone.name

        rename_error = None

        try:
            target_milestone.name = NEW_MILESTONE_NAME
        except Exception:
            rename_error = traceback.format_exc()

        immediate_name = target_milestone.name

        after_text = list_milestones(data_file)

        message = (
            "Milestone rename test finished.\n\n"
            f"Document: {document.name}\n"
            f"Target version: {TARGET_VERSION_NUMBER}\n\n"
            f"Before assignment:\n"
            f"milestone.name = '{old_name}'\n\n"
            f"Tried:\n"
            f"milestone.name = '{NEW_MILESTONE_NAME}'\n\n"
            f"Immediately after assignment:\n"
            f"milestone.name = '{immediate_name}'\n\n"
        )

        if rename_error:
            message += (
                "Assignment raised an exception:\n"
                f"{rename_error}\n\n"
            )
        else:
            message += "Assignment completed without exception.\n\n"

        message += (
            "Milestones BEFORE:\n"
            f"{before_text}\n\n"
            "Milestones AFTER:\n"
            f"{after_text}"
        )

        ui.messageBox(message)

    except Exception:
        ui.messageBox(f"Script error:\n\n{traceback.format_exc()}")&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;Actual output&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;Milestone rename test finished.

Document: 2003_0010_SHT___Blacha okragla
Target version: 15

Before assignment:
milestone.name = 'D'

Tried:
milestone.name = '-'

Immediately after assignment:
milestone.name = 'D'

Assignment completed without exception.

Milestones BEFORE:
Version 3: name='A', description='Milestone A created with updated part number 2003_0010_A_SHT___Blacha okragla', isValid=True
Version 4: name='B', description='User Saved', isValid=True
Version 5: name='API test version from saveDataVersion()', description='User Saved', isValid=True
Version 14: name='C', description='User Saved', isValid=True
Version 15: name='D', description='User Saved', isValid=True
Version 16: name='D', description='User Saved', isValid=True
Version 17: name='D', description='User Saved', isValid=True
Version 18: name='D', description='User Saved', isValid=True

Milestones AFTER:
Version 3: name='A', description='Milestone A created with updated part number 2003_0010_A_SHT___Blacha okragla', isValid=True
Version 4: name='B', description='User Saved', isValid=True
Version 5: name='API test version from saveDataVersion()', description='User Saved', isValid=True
Version 14: name='C', description='User Saved', isValid=True
Version 15: name='D', description='User Saved', isValid=True
Version 16: name='D', description='User Saved', isValid=True
Version 17: name='D', description='User Saved', isValid=True
Version 18: name='D', description='User Saved', isValid=True&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;Additional observation&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;The Fusion history UI / web viewer can edit the visible history entry text manually. I inspected the network request in Developer Tools and saw that the UI uses an internal GraphQL mutation:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;mutation CDEHistory_UpdateHistoryChangeDescription($input: UpdateHistoryChangeDescriptionInput!) {
  updateHistoryChangeDescription(input: $input) {
    historyChange {
      id
      description
      author {
        lastName
        firstName
      }
      timestamp
    }
  }
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P class=""&gt;&lt;SPAN&gt;The request payload contains:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;{
  "description": "-",
  "historyChangeId": "&amp;lt;redacted&amp;gt;"
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P class=""&gt;&lt;SPAN&gt;The response confirms:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;{
  "description": "-"
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P class=""&gt;&lt;SPAN&gt;However, after changing the visible history entry in the UI, the Fusion Python API still reports the original &lt;/SPAN&gt;&lt;SPAN&gt;milestone.name&lt;/SPAN&gt;&lt;SPAN&gt; value.&lt;/SPAN&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;SPAN&gt;This suggests that the Fusion UI is editing a &lt;/SPAN&gt;&lt;SPAN&gt;historyChange.description&lt;/SPAN&gt;&lt;SPAN&gt; field, while the Python API exposes &lt;/SPAN&gt;&lt;SPAN&gt;Milestone.name&lt;/SPAN&gt;&lt;SPAN&gt;, which either points to a different backend field or has a non-functional setter for existing milestones.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Questions&lt;/SPAN&gt;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;SPAN&gt;Is &lt;/SPAN&gt;&lt;SPAN&gt;Milestone.name&lt;/SPAN&gt;&lt;SPAN&gt; supposed to be editable for existing milestones returned from &lt;/SPAN&gt;&lt;SPAN&gt;dataFile.milestones&lt;/SPAN&gt;&lt;SPAN&gt;?&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;If yes, why does the Python setter silently fail/no-op?&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;If no, can the documentation be updated to say that existing milestone names are read-only?&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;Is there a supported public Fusion API for editing the same visible history/milestone description that the Fusion UI edits?&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;Should the setter raise an exception if changing existing milestone names is not supported?&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;SPAN&gt;Thanks.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 21 May 2026 07:52:19 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/fusion-api-and-scripts-forum/fusion-api-milestone-name-is-documented-as-read-write-but-setter/m-p/14137112#M22802</guid>
      <dc:creator>ppoloczek</dc:creator>
      <dc:date>2026-05-21T07:52:19Z</dc:date>
    </item>
    <item>
      <title>Re: Fusion API: Milestone.name is documented as read/write but setter is ignored for existing milestones</title>
      <link>https://forums.autodesk.com/t5/fusion-api-and-scripts-forum/fusion-api-milestone-name-is-documented-as-read-write-but-setter/m-p/14137590#M22806</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/9462569"&gt;@ppoloczek&lt;/a&gt;&amp;nbsp;-san.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;I tried it, and the milestone name was updated.&lt;/P&gt;
&lt;P&gt;Windows11 Fusion 360 Ver. 2702.1.58&lt;/P&gt;</description>
      <pubDate>Thu, 21 May 2026 14:21:37 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/fusion-api-and-scripts-forum/fusion-api-milestone-name-is-documented-as-read-write-but-setter/m-p/14137590#M22806</guid>
      <dc:creator>kandennti</dc:creator>
      <dc:date>2026-05-21T14:21:37Z</dc:date>
    </item>
  </channel>
</rss>

