Skip to content

feat(release): hold 5b — publish many from the release-attached VSIX - #543

Merged
transitrix merged 1 commit into
mainfrom
transitrix-studio/144-publish-many
Aug 15, 2026
Merged

transitrix merged 1 commit into
mainfrom
transitrix-studio/144-publish-many

Conversation

@transitrix

@transitrix transitrix commented Aug 15, 2026 •

Copy link
Copy Markdown
Owner

From: transitrix-studio.

Hold 5b of epic THQ-138 — publish many, consuming the hold-5a artifact.

What this does

  • New attach-release-vsix.yml: on release draft creation, builds the universal VSIX once (build-vsix.yml), records its SHA-256, and attaches both as release assets.
  • openvsx-publish.yml: on release published, downloads that exact attached asset and verifies its checksum instead of repackaging — no rebuild at publish time.
  • vscode-marketplace-publish.yml: removed the automatic release: published trigger, workflow_dispatch only now.

Why the third change

Creating a release for the Open VSX step also fires every other workflow listening for release: published — including the VS Code Marketplace publish workflow, which was still wired to that event. Epic THQ-138 is explicit that nothing is submitted to the VS Code Marketplace under it, and VSCE_PAT is a live repo secret, so an unguarded release would have made an authenticated request under the current publisher-identity block. Removing the automatic trigger closes that hole; the workflow is unchanged otherwise and still runs on demand.

Docs

Updated release-runbook.md, openvsx-publish-runbook.md, vscode-marketplace-publish-runbook.md to match: draft creation now attaches the artifact, Open VSX publish no longer waits on a Marketplace step, and the Marketplace workflow's trigger change is called out where a future reader would look for it.

Verification

  • YAML for all three changed/new workflow files parses cleanly (js-yaml).
  • Reused the exact artifact-consumption pattern already proven working in extension-e2e.yml (hold 6) for build-vsix.yml → download-artifact → hash check.
  • Not run end-to-end in this PR — the flow only executes on an actual release draft/publish, which is outside this PR's scope; the acceptance criteria call for the release attachment and registry-publish jobs, not for cutting a release here.

Not done in this PR

Actually cutting the next release (creating the draft, publishing it, verifying Open VSX ends up byte-identical) — that's a real, visible, one-way action against a live registry and stays a maintainer decision, same as the standing rule on running vsce package/vsce publish locally.

Attach the universal VSIX (build-vsix.yml) to a release draft as soon as
it is created, with its SHA-256, via a new attach-release-vsix.yml
workflow. openvsx-publish.yml now downloads and verifies that exact
release asset instead of repackaging at publish time, so the artefact
verified before release is the one that ships.

Also removes the automatic release trigger from
vscode-marketplace-publish.yml (workflow_dispatch only now): without
this, publishing a release for the Open VSX step above would also have
fired an unwanted VS Code Marketplace publish attempt, which the epic
constraint and the standing publisher-identity block both rule out.

transitrix-hq#144

Signed-off-by: transitrix <automation@transitrix.com>
@github-actions

Copy link
Copy Markdown

📊 Metrics Regression Report

✅ All metrics within tolerance

Summary

  • Diagrams tested: 9
  • Successful: 9
  • Failed: 0
  • Violations: 0

Details

ai-expense-approval.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 1 1 0.00 ✓
bends 6 6 0.00 ✓
edgeLength 1868 1868 0.00 (0.0%) ✓
waypointDensity 2.6 2.6 0.00 (0.0%) ✓
spineDeviation 0 0 0.00 ✓
emptyArea 0.48125 0.48125 0.00 ✓
portViolations 0 0 0.00 ✓

feature-release.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 1 1 0.00 ✓
bends 13 13 0.00 ✓
edgeLength 3428 3428 0.00 (0.0%) ✓
waypointDensity 3 3 0.00 (0.0%) ✓
spineDeviation 0 0 0.00 ✓
emptyArea 0.5500909090909091 0.5500909090909091 0.00 ✓
portViolations 0 0 0.00 ✓

large-cyclic-workflow.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 2 2 0.00 ✓
bends 28 28 0.00 ✓
edgeLength 7479 7479 0.00 (0.0%) ✓
waypointDensity 3.12 3.12 0.00 (0.0%) ✓
spineDeviation 66 66 0.00 ✓
emptyArea 0.793134974640294 0.793134974640294 0.00 ✓
portViolations 1 1 0.00 ✓

order-fulfillment.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 0 0 0.00 ✓
bends 2 2 0.00 ✓
edgeLength 728 728 0.00 (0.0%) ✓
waypointDensity 2.3333333333333335 2.3333333333333335 0.00 (0.0%) ✓
spineDeviation 0 0 0.00 ✓
emptyArea 0.5622894736842106 0.5622894736842106 0.00 ✓
portViolations 0 0 0.00 ✓

parallel-tracks.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 0 0 0.00 ✓
bends 6 6 0.00 ✓
edgeLength 2104 2104 0.00 (0.0%) ✓
waypointDensity 2.6666666666666665 2.6666666666666665 0.00 (0.0%) ✓
spineDeviation 33 33 0.00 ✓
emptyArea 0.6834468042259194 0.6834468042259194 0.00 ✓
portViolations 0 0 0.00 ✓

simple-approval.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 0 0 0.00 ✓
bends 8 8 0.00 ✓
edgeLength 1450 1450 0.00 (0.0%) ✓
waypointDensity 3.142857142857143 3.142857142857143 0.00 (0.0%) ✓
spineDeviation 33 33 0.00 ✓
emptyArea 0.7764882411250177 0.7764882411250177 0.00 ✓
portViolations 0 0 0.00 ✓

simple-linear.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 0 0 0.00 ✓
bends 0 0 0.00 ✓
edgeLength 440 440 0.00 (0.0%) ✓
waypointDensity 2 2 0.00 (0.0%) ✓
spineDeviation 0 0 0.00 ✓
emptyArea 0.5258771929824562 0.5258771929824562 0.00 ✓
portViolations 0 0 0.00 ✓

small-dense-approval.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 0 0 0.00 ✓
bends 14 14 0.00 ✓
edgeLength 2066 2066 0.00 (0.0%) ✓
waypointDensity 3.272727272727273 3.272727272727273 0.00 (0.0%) ✓
spineDeviation 33 33 0.00 ✓
emptyArea 0.8091206777597997 0.8091206777597997 0.00 ✓
portViolations 0 0 0.00 ✓

xlarge-stress-test.bpmn.transitrix.yaml

Metric Baseline Current Delta Status
crossings 0 1 +1.00 ✓
bends 62 64 +2.00 ✓
edgeLength 11526 11674 +148.00 (1.3%) ✓
waypointDensity 3.1481481481481484 3.185185185185185 +0.04 (1.2%) ✓
spineDeviation 132 132 0.00 ✓
emptyArea 0.8201716840253008 0.8201716840253008 0.00 ✓
portViolations 0 0 0.00 ✓

@github-actions github-actions Bot added the needs:human-merge Mergeable but not simple - requires human review/merge label Aug 15, 2026
@transitrix
transitrix merged commit 0bbe9eb into main Aug 15, 2026
4 checks passed
@transitrix
transitrix deleted the transitrix-studio/144-publish-many branch August 15, 2026 10:15
transitrix added a commit that referenced this pull request Sep 2, 2026
Hovering any node in the Goals tree, DGCA, or DGA preview now shows a native
SVG <title> tooltip with the full untruncated name and entity ID, even when
the visible label is truncated/ellipsized.

For Goals nodes, tooltip also includes the level (e.g. 'Name — ID — level 2').
For Change nodes (DGCA), includes the count of activity_ids (related to badge
work in #543).
For Action/Activity nodes, includes the type when present.

Implementation:
- Wrap node SVG (rect + text) in a <g> element
- Insert <title> child before the rect
- Content: full name + ID + notation-specific metadata
- No visual change to the node box itself

Covers Goals/DGCA/DGA. DGA uses the same renderer as DGCA via hideChanges option,
so both are updated by modifications to render-fgca.ts.

All tests passing.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
transitrix added a commit that referenced this pull request Sep 3, 2026
* feat: synthesize virtual Change nodes for activities without a real Change

When an Action reaches its Goal directly (no real CHANGE covers it), render a
pale virtual Change box at that position instead of a direct edge. This prevents
goal→activity skip edges from crossing the Change column visually.

Changes:
- Add VIRTUAL_ENTITY theme token (pale/neutral fill, dashed border)
- Synthesize virtual Change nodes in preview-layout.ts with 1:1 mapping to
  activities: goal→virtualChange→activity edges replace goal→activity direct edges
- Mark virtual nodes with a 'virtual' flag and apply 'layer-virtual' CSS class
- Update theme CSS to render virtual nodes with the new token
- Update preview-layout tests to account for new virtual nodes

Virtual nodes use em-dash placeholder labels and are excluded from edge crossing
logic by design (the edge now routes through the Change column). This approach
replaces the prior skip-edge arcing strategy.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* feat: add native title tooltips to Goals/DGCA/DGA node previews

Hovering any node in the Goals tree, DGCA, or DGA preview now shows a native
SVG <title> tooltip with the full untruncated name and entity ID, even when
the visible label is truncated/ellipsized.

For Goals nodes, tooltip also includes the level (e.g. 'Name — ID — level 2').
For Change nodes (DGCA), includes the count of activity_ids (related to badge
work in #543).
For Action/Activity nodes, includes the type when present.

Implementation:
- Wrap node SVG (rect + text) in a <g> element
- Insert <title> child before the rect
- Content: full name + ID + notation-specific metadata
- No visual change to the node box itself

Covers Goals/DGCA/DGA. DGA uses the same renderer as DGCA via hideChanges option,
so both are updated by modifications to render-fgca.ts.

All tests passing.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs:human-merge Mergeable but not simple - requires human review/merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant