update_product
Update the product header (`$upg.product`): stage, title, description, health_status, url, and the workspace member_kind. The supported way to advance a product's lifecycle stage or re-kind a graph; it writes the value get_graph_digest reads, without hand-editing the integrity-hashed .upg file. A title rename or a re-kind also reconciles the workspace.json cache and the portfolio.upg registry, so list_local_products, get_workspace_info, portfolio_census, counts.products, and the watched anti-pattern scoping all show the current value. Set rename_file (or pass an explicit slug) to also rename the .upg file to match the title: it moves the file, repoints the open handle so the rest of the session writes to the new path, and updates the workspace.json file path and the portfolio.upg file_path. The rename is opt-in; a plain title change leaves the filename alone.
Arguments
stagestringoptionalProduct lifecycle stage (canonical UPGProductStage).
titlestringoptionalProduct display title.
descriptionstringoptionalProduct description.
health_statusstringoptionalProduct health (free-form, e.g. on_track / at_risk).
urlstringoptionalProduct URL.
member_kindstringoptionalWorkspace member kind. product (default, an owned product), org_rollup (company umbrella graph), watched (a monitored intelligence graph, e.g. a competitor), or operating_function (a function a team operates, across revenue/success/finance/people/marketing, not a product it ships). Non-product kinds are excluded from product coverage / counts and graded on their own validation profile.
rename_filebooleanoptionalRename the .upg file to match the title slug. Opt-in; moves the file and reconciles the open handle, workspace.json path, and portfolio.upg file_path.
slugstringoptionalExplicit slug for the file rename (implies rename_file). Slugified and collision-resolved so a sibling file is never clobbered.
Returns
{ product, updated: string[] }(the fields changed).